Bash-是否可以在一行的一列中使用-uniq?

时间:2012-11-27 11:35:57

标签: bash sorting uniq

    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可以忽略许多字符但是从示例中可以看出第一列可能有不同的字符数。

请咨询..

3 个答案:

答案 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