如何在分隔符到来时对字符串开始的行进行排序(linux)

时间:2013-10-16 10:15:43

标签: linux sorting awk delimiter

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

文件是这样的:

adf234sdf:nzzs13245ekeke  
zdkfjs:ndsd34352jejs  
mkd45fei:znnd11122iens
输出应该是:

mkd45fei:znnd11122iens  
adf234sdf:nzzs13245ekeke  
zdkfjs:ndsd34352jejs

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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 '-')。

答案 2 :(得分:1)

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];
   }
}