【问题标题】:Bash output the line with highest valueBash 输出最高值的行
【发布时间】:2012-11-14 21:30:55
【问题描述】:

我的问题很像this one,但有一点不同;我想要输出在第三个选项卡上得分最高的行。我的数据是这样的:

1.gui  Qxx  16
2.gui  Qxy  23
3.guT  QWS  11

我想得到这个:

1.gui  Qxy  23
3.guT  QWS  11

我用过:

cat file.f | uniq | cut -d" " -f3 | sort | uniq -d >>out.f

但没有得到我想要的!?

【问题讨论】:

  • 可以重新检查输入输出吗?输出中的1.gui... 是否应该是2.gui...
  • @Raze2dust 数字对于第一个选项卡并不重要;他们只是为了代表行号..
  • k.. 那么您应该在输出中将3.guT 更改为2.guT。否则会令人困惑。

标签: linux bash sorting uniq


【解决方案1】:

这必须为重复名称的那些行提供最高值,并保留那些没有重复名称的行。

sort -rk3 file | awk '!seen[$1]++' > file_filtered.txt

【讨论】:

    【解决方案2】:

    对于未来有相同问题的用户:

    不要忘记在-sort 命令中引入 -n 开关,或者您的值从 9999 开始排序,然后是 999 等。所以使用

    sort -rnk3 file
    

    如果您只想获得最高值的一行(删除重复项),请使用:

    sort -rnk3 file | awk '!x[$2]++'
    

    如果你有一个常用的分隔符,你可以告诉-awk 注意:

    sort -rnk3 file | awk -F"[. ]" '!x[$2]++'
    

    【讨论】:

    • 太棒了——我一直在寻找可以防止特定字段重复的特定 awk 构造——我不知道这是否可以通过 bash 排序来实现——似乎-u 完全可以使用行。
    【解决方案3】:

    sort:

    $ sort -rk3 file             # Sort on column 3, display all results
    
    2.gui  Qxy  23
    1.gui  Qxx  16
    3.guT  QWS  11
    
    $ sort -rk3 file | head -2   # Sort on column 3, filter number of results
    
    2.gui  Qxy  23
    1.gui  Qxx  16
    
    $ sort -rk3 file | uniq      # Sort on column 3, on display unique results 
    
    2.gui  Qxy  23
    1.gui  Qxx  16
    3.guT  QWS  11
    

    -r逆向排序,最高优先。

    -k3 排在第三列。


    如果您只想显示第 3 列大于某个值的行(即 15),请尝试使用 awk

    awk '$3>15' file | sort -rk3  # Display line where column 3 > 15 and sort
    
    2.gui  Qxy  23
    1.gui  Qxx  16
    

    【讨论】:

    • 感谢@sudo_O.. 排序后你只得到了第一行,但我想要得到所有出现..
    • 问题是,我的文件有大约 1000 万行,我不知道每个文件出现了多少次......意思是,我不知道我可以用 head 得到多少行......
    • 如果您想要所有结果,只需执行sort -rk3 file
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多