【问题标题】:Bash- is it possible to use -uniq for only one column of a line?Bash-是否可以仅将 -uniq 用于一行的一列?
【发布时间】:2012-11-27 11:35:57
【问题描述】:
    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 的方法,因为它将一行视为一个整体,因为我不能告诉@987654327 @查看第一列,它计算一个具有唯一性的行并输出它-这是正常的-。我知道-uniq 可以忽略许多字符,但正如您从示例中看到的那样,第一列可能有不同的字符数..

请指教..

【问题讨论】:

标签: bash sorting uniq


【解决方案1】:

试试这个:

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

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

【讨论】:

  • 第二列,因为我们用 .和空格作为分隔符,因此第二列会给我们gui等。
【解决方案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 选项让您指定字段分隔符,在这种情况下,它可以是空格或句点。

【讨论】:

  • 嘿@sudo_O ..再次感谢。你能解释一下 -awk 命令吗?
【解决方案3】:

所以我是通过强大而令人惊叹的 Google 发现的—— 我的小脚本建立在@sudo_O 的答案之上,因为它向您显示找到的所有重复行......,而不是没有重复的文件。

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

awk '{if (a[$3]++ > 0) print}' master.txt |同时读取站点线程端口 做 grep $port master.txt 完毕

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2019-10-17
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多