如何按字母顺序排序但尊重长度(先短线)

时间:2016-01-22 20:44:13

标签: linux sorting command

我想按字母顺序对文件中的行进行排序,但是要考虑行长度(较短的第一行)

示例:

a
b
aa
bbb
zzzz
ccccc

使用sort命令我得到:

a
aa
b
bbb
ccccc
zzzz

如何获得第一个输出?

3 个答案:

答案 0 :(得分:1)

for i in `cat your_file`; do echo ${#i}$'\t'${i}; done | sort -n | cut -f 2-
  1. 将每行的长度插入每个行的切割分隔符(\ t);
  2. 按数字排序排序(-n);
  3. 删除无用的字符串

答案 1 :(得分:0)

在我的评论中,我提出了一种方法,会变成丑陋的东西:

awk 'BEGIN { maxlen=0 }
   {len=length($0); a[len,NR]=$0; if (len > maxlen) maxlen=len }
   END {
          for (row=1; row <= maxlen; ++row) {
            for (i=1;i<=NR;i++) {
               if (a[row,i]) {
                  ax[i]=a[row,i];
               }
            }
            asort(ax)
            for (s in ax)
               print ax[s]
            delete ax
          }
       }' input

在阅读了@Bo的智能解决方案之后,我又回到了正轨。他的代码比我上面的解决方案更快更干净(在将其重写为while read -r i; do echo ${#i}$'\t'${i}; done < input | sort -n | cut -f 2-后进行测试)。同样的技巧可以在awk中完成,并且使用正确的方法awk运行良好:

awk '
   { len=sprintf ("%20s",length($0)); gsub(/ /,0,str); a[NR]=len "_" $0; }
   END {
            asort(a)
            for (s=1;s<=NR;s++)
               print substr(a[s],22)
       }' input

答案 2 :(得分:-1)

Javascript(arr是数组):

arr.sort()。sort((a,b)=&gt;(a.length&gt; b.length));

说明:

第一部分:arr.sort()将返回按字母顺序排序的数组。

第二个pard将按元素的长度再次排序。

(a,b)=&gt; (a.length> b.length)也可以写成:

function(a, b){return a.length > b.length;}