【问题标题】:how can I sort the line of a file according to the special part of the line如何根据行的特殊部分对文件的行进行排序
【发布时间】:2016-10-07 16:25:25
【问题描述】:

这是我要排序的文件内容(只是一个简化的例子):

  1 33      blabla_0_banana
  2 32333   lablab_4_apple
  3 1232312 hahaah_1_banana
  4 3342222 ohohoh_2_apple

我想用两个要求对结果进行排序:

  1. 首先是词尾(例如:banana\apple)

  2. 其次是两个“_”符号之间的数字:_[数字]_(例如:0\4\1\2)

这是我想要的结果:

  4 3342222  ohohoh_2_apple
  2 32333    lablab_4_apple
  1 33       blabla_0_banana
  3 1232312  hahaah_1_banana

最后,我想删除第二个数字>100000的行,这也是我想要的结果:

  2 32333    lablab_4_apple
  1 33       blabla_0_banana

我该怎么做?也许使用命令 'sort' 、 'awk' 或其他命令。

【问题讨论】:

    标签: regex shell sorting awk


    【解决方案1】:

    使用sort

    sort -t_ -k3 -k2n file
    
    4 3342222 ohohoh_2_apple
    2 32333   lablab_4_apple
    1 33      blabla_0_banana
    3 1232312 hahaah_1_banana
    

    要仅保留带有2nd column < 100000 的行,请使用awk

    awk '$2<100000' file | sort -t_ -k3 -k2n
    2 32333   lablab_4_apple
    1 33      blabla_0_banana
    

    Working Code Demo

    【讨论】:

    • 谢谢!很神奇,但是awk命令不起作用,可能有一些错误?您能否详细解释一下 -t_、-k3、-k2n 的工作原理?
    • -t 选项将分隔符设置为下划线。 -k3 将第 3 列设置为第一个排序键,-k2n 按数字顺序将第 2 列设置为第 2 个排序键。还要检查man sort
    • 您也可以在排序之前进行过滤,如果数据集很大,这可能会有所帮助(对将被丢弃的行进行排序没有意义和成本)。基本查询优化……
    • @springcc:它适用于 Mac OS X 10.11.5 以及 sortawk 的原生版本。它也适用于sort (CoreUtils 8.24) 和awk (4.1.3) 的GNU 版本。您在哪个平台上,使用哪个版本的工具?您可以尝试改用sort -t_ -k3,3 -k2,2n;这将排序标准每次都限制为一个字段。无论有无逗号子句,我都会得到相同的结果。显然,我们仅使用您的最小样本数据进行测试。
    • 不好意思浪费你的时间,这是我的愚蠢错误:这个问题的第一个数字(1,2,3,4)是vim显示的行号,我忘记了,所以正确的方法是 1 美元。真的很抱歉。@JonathanLeffler
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2016-10-02
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多