Bash 从最长到最短排序行

Bash 从最长到最短排序行,bash,Bash,如何将文件中的所有行从最长重新排列到最短?例如: elephant zoo penguin 将更改为 elephant penguin zoo 添加行长作为行的第一个字段,排序并删除行长: awk '{ print length($0) " " $0; }' $file | sort -r -n | cut -d ' ' -f 2- 使用POSIX Awk: { c=长度 m[c]=m[c]?m[c]卢比0:$0 }结束{ 对于(m中的c)q[++x]=m[c] 而(x)打印q[x--]

如何将文件中的所有行从最长重新排列到最短?例如:

elephant
zoo
penguin
将更改为

elephant
penguin
zoo

添加行长作为行的第一个字段,排序并删除行长:

awk '{ print length($0) " " $0; }' $file | sort -r -n | cut -d ' ' -f 2-
使用POSIX Awk:

{
c=长度
m[c]=m[c]?m[c]卢比0:$0
}结束{
对于(m中的c)q[++x]=m[c]
而(x)打印q[x--]
}

Perl版本,在@thiton中添加了一个提示:

perl-ne'打印长度($)。“$”文件|排序-r-n |剪切-d'-f2-

$是当前行,类似于awk的
$0

perl-5.24在一个550MB.txt文件上执行,有600万行(英国国家语料库),耗时24秒


@蒂顿的awk(3.1.7)执行耗时26秒


在一篇相关文章中,向@William Pursell致敬:

perl-ne'push@a,$\;结束{打印反向排序{length$a length$b}@a}'文件

perl-5.24的执行耗时12.0秒(我的TIMTOWTDI的简洁版本…嗯,但现在已经很长了:(

perl-ne'@a=;打印排序{length$b length$a}@a'文件
允许在需要时保留
反向
推送


我想知道这个550MB的文件需要多长时间

为什么是猫?@Fredrik:我喜欢把文件名放在我的管道前面。不过你有更好的奖励,所以我已经修复了它。可以缩短为
$awk'{print length'\t“$0}'File | sort-rn | cut-f2-
这基本上是一样的,只是cut在默认情况下对制表符进行操作,所以忽略这一点:-)@Fredrik您使用制表符作为分隔符而不是空格字符的较短版本有一个负面的副作用,即制表符首先被打印出来'tlds alpha by domain.txt
outputs`"$0}'tlds alpha by domain.txt2 AC`etc…使用不带制表符的较长版本会生成更安全的终端/命令输出。至少在Mac OS X 10.7.5上的bash 3.2版本中运行时是如此。@thiton:您可以将文件名放在前面,而无需使用
cat
,如下所示:
output_file
exa如果你不回头看问题,mple有点误导。要对单词列表进行排序,从长到短,调整可接受的答案,例如
pip-search-json | awk'{print length($1)”\t“$1}”| sort-rn | cut-d'-f2-
。显然是“pip-search-json”在perl 5.24上,550MB的文件花费了14.2秒
perl -ne '@a = <>; print sort { length $b <=> length $a } @a' file