awk根据具体列判断并输出所有符合条件的列

awk根据具体列判断并输出所有符合条件的列

这是我的文件,其中包含三个列,并用“\t”分隔,第二个列由空格分隔。

            1    a b c d e    Tom
            2    a b          Jason 
            3    c            Lisa
            4    e            Kim 

我想获取第二列包含两个以上元素的文件,“NF>2”

            1    a b c d e    Tom
            2    a b          Jason

受益于埃德·莫顿的小费。我已经尝试过 less -S test.txt | awk -F "\t" '{print $2}' | awk 'NF>2',但我无法得到整条线。实际上,我一直很困惑如何根据列中的某个条件输出满足条件的整行。我只知道一些简单的情况,比如cat test.txt | awk '{if( )print$0}'。你能给我一些建议吗?多谢。

答案1

$ awk -F'\t' 'split($2,a," ") >= 2' input.txt 
1       a b c d e       Tom
2       a b     Jason

使用 TAB 作为字段分隔符,这会打印$2包含至少两个由空格分隔的字符串的每一行。

split()使用正则表达式作为分隔符(在本例中为单个空格)将字符串 ( $2) 拆分为数组 ( )。有关该功能的详细信息,a请参阅。man awksplit

这个 awk one-liner 不使用也不关心 array 的内容a,它只是检查 split 函数的返回值 - 这是字符串被分割成的元素数量。如果大于或等于 2,则条件评估为 true 并打印整行。


顺便说一句,如果您想更好地理解它是如何工作的,查看每个 $2 中的元素数量会有所帮助。例如,像这样的东西,它将返回值分配给split变量n,然后将其与输入行一起打印:

$ awk -F'\t' '{n=split($2,a," ");printf "(n=%i)\t%s\n",n,$0}' input.txt 
(n=5)   1       a b c d e       Tom
(n=2)   2       a b     Jason
(n=1)   3       c       Lisa
(n=1)   4       e       Kim

因此第一行有 5 个元素,第二行有 2 个,最后两行各只有一个。

相关内容