Bash 如何将文件中的行从最短到最长排序?

Bash 如何将文件中的行从最短到最长排序?,bash,sorting,awk,Bash,Sorting,Awk,类似于,如何将文件中的所有行从最短到最长排序?例如。” 这是一个很长的句子。 时间不长。 这并不长。 这就变成了: This is not long. This is not so long. This is a long sentence. 这并不长。 时间不长。 这是一个很长的句子。 这和你给的链接几乎完全一样 awk '{ print length($0) " " $0; }' $file | sort -n | cut -d ' ' -f 2- -r选项用于反向排序。请注意,此解决方案

类似于,如何将文件中的所有行从最短到最长排序?例如。”

这是一个很长的句子。 时间不长。 这并不长。 这就变成了:

This is not long. This is not so long. This is a long sentence. 这并不长。 时间不长。 这是一个很长的句子。
这和你给的链接几乎完全一样

awk '{ print length($0) " " $0; }' $file | sort -n | cut -d ' ' -f 2-

-r
选项用于反向排序。

请注意,此解决方案在大输入时性能不佳。

您还可以在
awk
中进行排序:

cat文件
这是一个很长的句子。
时间不长。
这并不长。
EOF
sort.awk

#只查找一次长度
{len=长度($0)}
#如果我们之前没有看到这一行,请将其添加到lines数组中
#然后继续下一个记录
行[len]==“”{lines[len]=$0;下一个}
#重复,附加到上一条记录
{lines[len]=lines[len]RS$0}
结束{
#lines数组根据索引进行排序,排序后的
#索引存储在索引数组中
asorti(行、索引)
用于(输入索引)
打印行[索引[键]]
}
像这样跑:

awk -f sort.awk file
或作为一个班轮:

< file awk '{ len = length($0) } lines[len] == "" { lines[len] = $0; next } { lines[len] = lines[len] RS $0 } END { asorti(lines, indices); for(key in indices) print lines[indices[key]] }'
使用POSIX Awk:

{
c=长度
m[c]=m[c]?m[c]卢比0:$0
}结束{
对于(c in m)打印m[c]
}

另一个perl实现:

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


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

+1。在200+K日志文件上测试时,速度要快7.5倍。
asorti
解决方案被终止,因为它花费的时间太长,不确定为什么效率这么低。接下来的问题是:您可能不应该混淆用户,并编写
perl-ne'push@a,$\u>END{print sort{length$a length$b}@a}'
取而代之的是…@Slaven,我同意!不幸的是,这种-p while/loop-braces黑客在perl中很常见…将使用适当的免责声明进行编辑。我在550MB的文本语料库上测试了几种解决方案,发现使用纯perl会比perl+管道到shell命令的速度提高6倍。
< file awk '{ len = length($0) } lines[len] == "" { lines[len] = $0; next } { lines[len] = lines[len] RS $0 } END { asorti(lines, indices); for(key in indices) print lines[indices[key]] }'
perl -ne 'push @a, $_ } { print sort { length $a <=> length $b } @a' input
perl -ne '{ push @a, $_ } END { print sort { length $a <=> length $b } @a }' input