我有环境许可证持有者的大型 .csv 文件,我想仅提取特定许可证类型的行,但也包括标题行。我当前的脚本:
BEGIN { FS = OFS = ","
NR == 1; print $0 }
$7 ~ /"GEN12Z"/ { print $0 }
这会打印一个空行,然后打印 $7 与模式字符串匹配的所有行。我尝试过其他语法来识别第一行并将其添加到提取的行之前,但都未能做到这一点。需要一根线索棒。
TIA,
有钱
空行来自
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"/