gawk:在根据字段内容选择行之前打印标题行

问题描述 投票:0回答:1

我有环境许可证持有者的大型 .csv 文件,我想仅提取特定许可证类型的行,但也包括标题行。我当前的脚本:

BEGIN { FS = OFS = ","
  NR == 1; print $0 }
  $7 ~ /"GEN12Z"/ { print $0 }

这会打印一个空行,然后打印 $7 与模式字符串匹配的所有行。我尝试过其他语法来识别第一行并将其添加到提取的行之前,但都未能做到这一点。需要一根线索棒。

TIA,

有钱

awk
1个回答
1
投票

空行来自

print $0
块中的
BEGIN
;这里的问题是在处理任何输入行之前处理
BEGIN
块,这意味着
$0
未定义(也称为空),因此
print $0
生成一个空行。

从描述来看,OP 想要打印文件的第一行,因此是代码片段

NR == 1; print $0
,但是这里有几个问题:

  • 此代码片段需要移出
    BEGIN
    块,以便可以应用于输入行
  • NR==1;
    是一个独立的比较,因为尾随的
    ;
    实际上并没有触发
    print $0
    ;删除
    ;
    仍然给我们带来语法问题

将 OP 的代码修复为我认为需要的:

$ cat test.1.awk
BEGIN { FS = OFS = "," }
  NR == 1         { print $0 }
  $7 ~ /"GEN12Z"/ { print $0 }

样本数据文件:

$ cat dat.csv
header row
1,2,3,4,5,6,"GEN001",123
1,2,3,4,5,6,"GEN12Z",ABC
1,2,3,4,5,6,"GEN001",123
1,2,3,4,5,6,"GEN12Z",DEF

测试新代码:

$ awk -f test.1.awk dat.csv
header row
1,2,3,4,5,6,"GEN12Z",ABC
1,2,3,4,5,6,"GEN12Z",DEF

由于

print $0
是成功测试的默认操作,我们还可以使用以下任意操作来提供相同的输出:

BEGIN { FS = OFS = "," }
  NR == 1
  $7 ~ /"GEN12Z"/

------------------

BEGIN { FS = OFS = "," }
  NR == 1 || $7 ~ /"GEN12Z"/

------------------

BEGIN { FS = OFS = "," }
  NR == 1; $7 ~ /"GEN12Z"/
© www.soinside.com 2019 - 2024. All rights reserved.