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

Linux 使用AWK/Perl在K列为空时提取行,linux,perl,unix,awk,Linux,Perl,Unix,Awk,我有如下数据: foo 78 xxx bar yyy qux 99 zzz xuq xyz 它们以制表符分隔。 如何在第2列为空的情况下提取行 bar yyy xuq xyz 我试过这个,但似乎不起作用: awk '$2==""' myfile.txt 您需要将字段分隔符专门设置为制表符: > cat qq.in foo 78 xxx bar yyy qux 99 zzz xuq

我有如下数据:

foo 78 xxx
bar    yyy
qux 99 zzz
xuq    xyz
它们以制表符分隔。 如何在第2列为空的情况下提取行

bar    yyy
xuq    xyz
我试过这个,但似乎不起作用:

awk '$2==""' myfile.txt 

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

> 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
awk
的默认行为是将空间的
FS
视为特例(默认)。从手册页:

FS
是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。(我的斜体)

将grep由字符组成的每行选项卡字符(选项卡之间无任何内容)

命令开关

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

@daotoad:他说“在第2列为空的地方提取行”。如果他只希望第2列为空,则必须指定为空。在这种情况下,请将.*替换为有效字符的范围(或不允许字符范围的反转)。也许[^\t]可以。取决于他的规格!实际上,@daotoad,在一个3列文件中,我认为获得两个连续制表符的唯一方法是如果第2列为空,而不管第1列或第3列的状态如何。所以这个答案对我来说仍然有效。是的,请记住我之前的评论。这两个选项卡只能出现在“内部空白”上。换句话说,在N列表(其中N>=3)上,它们可以出现在第2列到第N-1列上。因为我们有一个三列表,这意味着只有2列。结束列上的分隔符是换行符或文件的开始/结束。这个错误证明已经过了我的就寝时间。很抱歉出现错误。使用autosplit做得很好!我总是忘记这一点,当一行就可以了的时候,我会写一些小脚本。如果$F[1]eq为“”,那么这不应该是
打印吗?否则,将打印一列,如
aaa0bbb
。另外,对于我的shell/perl,
-F
选项必须是
-F'\t'
-F'\t'
,不管perlrun怎么说,它都不像
-F/\t/
。我也可以用
-F=/\\t/
绕过插值,但它非常难看。您可以将tab char指定为awk选项,而不是在BEGIN子句中。这是选项卡字符的bash语法:
awk-F$'\t'$2==''文件…
grep -e '^.*\t\t.*$' myfile.txt
perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt