我想按字母顺序对文件中的行进行排序,但是要考虑行长度(较短的第一行)
示例:
a
b
aa
bbb
zzzz
ccccc
使用sort命令我得到:
a
aa
b
bbb
ccccc
zzzz
如何获得第一个输出?
答案 0 :(得分:1)
for i in `cat your_file`; do echo ${#i}$'\t'${i}; done | sort -n | cut -f 2-
答案 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;}