使用AWK/Perl在列K为空时提取行

nev*_*int 15 unix linux perl awk

我的数据看起来像这样:

foo 78 xxx
bar    yyy
qux 99 zzz
xuq    xyz
Run Code Online (Sandbox Code Playgroud)

它们是制表符分隔的.如何提取第2列为空的行,让步

bar    yyy
xuq    xyz
Run Code Online (Sandbox Code Playgroud)

我试过这个,但似乎不起作用:

awk '$2==""' myfile.txt 
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 15

您需要专门将字段分隔符设置为TAB字符:

> cat qq.in
  foo     78      xxx
  bar             yyy
  qux     99      zzz
  xuq             xyz
> cat qq.in | awk 'BEGIN {FS="\t"} $2=="" {print}'
  bar             yyy
  xuq             xyz
Run Code Online (Sandbox Code Playgroud)

默认行为awk是治疗的FSSPACE(默认值)作为一种特殊情况.从手册页:

在这种特殊情况FS是一个单一的空间,字段由分离运行的空间和/或突出部和/或换行.(我的斜体)

  • 您可以将tab char指定为awk选项,而不是BEGIN子句.这是tab char的bash语法:`awk -F $'\ t''$ 2 ==""'file ...` (5认同)

Zai*_*aid 5

perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt
Run Code Online (Sandbox Code Playgroud)

命令开关

  • -F 告诉Perl自动分割的分隔符(在这种情况下为制表符)
  • -a 启用自动分割模式,在指定的分隔符上拆分每一行以填充数组 @F
  • -l自动"\n"在每个打印行的末尾添加换行符
  • -n 逐行处理文件
  • -e 将第一个引用的参数视为代码而不是文件名