1.gui Qxx 16
2.gu Qxy 23
3.guT QWS 18
4.gui Qxr 21
我想根据第3列中的值对文件进行排序,所以我使用:
sort -rnk3 myfile
2.gu Qxy 23
4.gui Qxr 21
3.guT QWS 18
1.gui Qxx 16
现在我必须输出:(以3.gui开头的行是因为带有4.gui的行有更大的值)
2.gu Qxy 23
4.gui Qxr 21
1.guT QWS 18
我无法使用-head
,因为我有数百万行,而且我没有在哪里切割,我无法想办法使用-uniq
,因为它将整行视为一条线,因为我可以不要告诉-uniq
查看第一列,它会计算一条唯一的输出它的线 - 这是正常的 - 。我知道-uniq
可以忽略许多字符但是从示例中可以看出第一列可能有不同的字符数。
请咨询..
答案 0 :(得分:8)
试试这个:
sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++'
awk根据第二列删除重复项。这实际上是一个着名的awk语法来删除重复。维护一个数组,保持第二个字段的记录。每次打印记录之前,都会在数组中检查第二个字段。如果不存在,则打印,否则将其丢弃,因为它是重复的。这是使用++实现的。第一次,当遇到记录时,此++将自其修复后的计数保持为0。随后出现的事件将增加被否定的价值变为虚假的价值。
答案 1 :(得分:2)
你走了:
sort -rnk3 file | awk -F'[. ]' '{ if (a[$2]++ == 0) print }'
2.gu Qxy 23
4.gui Qxr 21
1.guT QWS 18
这使用awk
检查第二个字段中的重复值,其中字段分隔符是空格或句点。所以这就是它将第二个领域视为:
$ awk -F'[. ]' '{ print $2 }' file
gu
gui
guT
gui
在awk
中,变量$0
代表整行,$1
代表第一个字段,依此类推......
awk -F'[. ]' '{ if (a[$2]++ == 0) print }'
-F
选项允许您指定字段分隔符,在这种情况下,它是空格或句点。
答案 2 :(得分:0)
所以我发现这是一个强大而神奇的Google - 我的小脚本建立了@sudo_O的答案,因为它显示了找到的所有重复行....,而不是没有重复的文件。
我在第3列(端口)中找到所有重复项的文本位于名为master.txt的文件中
awk '{if (a[$3]++ > 0) print}' master.txt | while read site thread port do grep $port master.txt done