6
    1.gui  Qxx  16
    2.gu   Qxy  23
    3.guT  QWS  18
    4.gui  Qxr  21

我想根据第三列中的值对文件进行排序,所以我使用:

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可以忽略许多字符,但正如您从示例中看到的第一列可能有各种字符数..

请指教..

4

3 回答 3

8

试试这个:

sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++'

awk 根据第二列删除重复项。这实际上是一种著名的 awk 删除重复项的语法。维护了一个数组,其中维护了第二个字段的记录。每次打印记录之前,都会检查数组中的第二个字段。如果不存在,则打印它,否则将其丢弃,因为它是重复的。这是使用 ++ 实现的。第一次,当遇到记录时,这个 ++ 将自其后修复以来将计数保持为 0。后续出现将增加值,当否定时变为假。

于 2012-11-27T11:43:34.563 回答
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选项让您指定字段分隔符,在这种情况下,它是空格或句点。

于 2012-11-27T11:51:17.067 回答
0

因此,我通过功能强大且令人惊叹的 Google 发现了这一点——我的小脚本构建了 @sudo_O 的答案,因为它向您显示找到的所有重复行......,而不是没有重复的文件。

我在第三列(端口)中找到所有重复项的文本位于名为 master.txt 的文件中

awk '{if (a[$3]++ > 0) print}' master.txt | 同时读取站点线程端口
做
  grep $port master.txt
完毕
于 2013-06-21T18:29:55.830 回答