仅当字段中的值与上一行不匹配时才打印

时间:2014-04-06 12:46:35

标签: perl sorting unix sed gawk

好的,所以我不确定gawk是否是最好的工具,所以如果有人使用perl,sed,uniq这么简单的方法,我会很乐意使用它。我试图过滤一组看起来像这样的数据:

"1" "ARI201304010" "SLN" 1 0 0 1
"2" "ARI201304010" "SLN" 1 0 1 1
"3" "ARI201304010" "SLN" 1 0 1 3
"4" "ARI201304010" "SLN" 1 0 1 0
"5" "ARI201304010" "SLN" 1 0 2 1
"6" "ARI201304010" "SLN" 1 1 0 1
"7" "ARI201304010" "SLN" 1 1 0 0
"8" "ARI201304010" "SLN" 1 1 1 0
"9" "ARI201304010" "SLN" 1 1 2 2
"10" "ARI201304010" "SLN" 2 0 0 0

第5个元素只能是10。 我想要打印的是第5个字段上每次最后出现的值。 仅在第5个字段没有加上之前的行中的值时打印。

1 个答案:

答案 0 :(得分:1)

我认为awk是正确的工具:

 awk '$5 != last; {last = $5}' last=-1 input

请注意,如果第5个字段与'之前的行中的值不匹配,则会打印一行,但不会打印每个最后一次出现的值'。但我并不完全理解你问题中的倒数第二句,所以我忽略了它,因为它似乎与问题的最后一句相矛盾。

如果您想要的是仅在下一行的第5个字段不同时打印一行,请尝试:

 awk '$5 !=b && NR>1{print a} {a=$0; b=$5}' input