这是我的文件,其中包含三个列,并用“\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 awk
split
这个 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 个,最后两行各只有一个。