【问题标题】:how to sort lines where sorting starts when a delimeter comes (linux)如何在分隔符出现时对字符串开始的行进行排序(linux)
【发布时间】:2013-10-16 10:15:42
【问题描述】:

我想对每一行都有特定分隔符的文件进行排序。我想对行进行排序,以便从该分隔符开始排序并仅根据数字进行排序。

文件是这样的:

adf234sdf:nzzs13245ekeke  
zdkfjs:ndsd34352jejs  
mkd45fei:znnd11122iens

输出应该是:

mkd45fei:znnd11122iens  
adf234sdf:nzzs13245ekeke  
zdkfjs:ndsd34352jejs

【问题讨论】:

    标签: linux sorting awk delimiter


    【解决方案1】:

    使用-t 选项设置分隔符:

    $ sort -t: -nk2,2 file
    mkdfei:11122iens
    adf234sdf:13245ekeke
    zdkfjs:34352jejs
    

    【讨论】:

    • -nk2,2 在这里是什么意思。你能解释一下吗
    • -n 表示数字,而k2,2 表示第二列,也就是那一列。以stackoverflow.com/a/19031538/1983854 为例
    • 如果数字前有字母,我只想从数字中排序。例如。 mkdfei:zzhe11122iens
    • @user000001 我已经在问题中添加了一个约束。你现在可以看看它。
    • @user1660982 Fedorqui 的回答应该做你想做的事
    【解决方案2】:

    这可以是一种方法,基于this idea

    $ sed -r 's/([^:]*):([a-z]*)([0-9]*)(.*)/\1:\2-\3\4/g' a | sort -t- -k2,2 | tr -d '-'
    mkdfei:aa11122iens
    adf234sdf:tt13245ekeke  
    zdkfjs:aa34352jejs  
    

    按件:

    $ sed -r 's/([^:]*):([a-z]*)([0-9]*)(.*)/\1:\2-\3\4/g' a 
    adf234sdf:tt-13245ekeke  
    zdkfjs:aa-34352jejs  
    mkdfei:aa-11122iens
    $ sed -r 's/([^:]*):([a-z]*)([0-9]*)(.*)/\1:\2-\3\4/g' a | sort -t- -k2,2
    mkdfei:aa-11122iens
    adf234sdf:tt-13245ekeke  
    zdkfjs:aa-34352jejs  
    $ sed -r 's/([^:]*):([a-z]*)([0-9]*)(.*)/\1:\2-\3\4/g' a | sort -t- -k2,2 | tr -d '-'
    mkdfei:aa11122iens
    adf234sdf:tt13245ekeke  
    zdkfjs:aa34352jejs  
    

    所以我们要做的是在第一个数字之前添加一个- 字符。然后我们根据那个字符排序,最后把-删回来(tr -d '-')。

    【讨论】:

    • 实际上我想根据分隔符后出现的数字进行排序
    • 所以 -234sdf 不应该在排序标准中而不是第二行,标准应该是 -13245
    • 哦,那是真的。改进我的sed 表达式。
    • 已更新,@user1660982,现在确实如此。
    【解决方案3】:

    gawk 中有一个asort 函数,你可以使用:

    gawk -f sort.awk data.txt 
    

    data.txt 是您的输入文件,sort.awk

    { 
        line[NR]=$0;
        match($0,/:[^0-9]*([0-9]*)/,a)
        nn[NR]=a[1]" "NR
    }
    
    END {
       N=asort (nn);
       for (i=1; i<=N; i++) {
          split(nn[i],c," ")
          ind=c[2]
          print line[ind];
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 2019-10-17
      • 2014-10-10
      • 2019-12-18
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多