【发布时间】:2013-05-16 00:40:41
【问题描述】:
考虑以下输入和输出:
infile | outfile
1 3 5 2 4 | 1 2 3 4 5
2 4 5 | 2 4 5
4 6 2 1 | 1 2 4 6
是否有任何 UNIX 程序的组合,不涉及编程语言 - 除了 shell 脚本本身 - 对每一行中的条目进行排序比以下方法更快的文件:
while read line; do
tr ' ' '\n' <<< ${line} | sort | tr '\n' ' '
echo ""
done < infile > outfile
我的意思是,我可以创建一个小的 cpp/python/awk/... 程序来做到这一点,但这与使用通常的 one-liners 神奇地解决问题不同。 p>
编辑:
我一定是加了太多文字,而不是简单地问我想要什么;直截了当,我想确认是否有任何 UNIX 程序/程序组合(使用管道、fors、whiles、...)能够对一行中的条目进行排序,但没有像上面的一种解决方案。
我知道我可能会用一种编程语言(如 perl、awk、python)来完成讨厌的工作,但我实际上是在寻找一种不涉及这些语言解释器的 UNIX 程序组合。从答案中,我必须得出结论,不存在这样的 inline sort 工具,我非常感谢我所拥有的解决方案——主要是非常简洁的 Perl 单线。
然而,我并不真正理解我发布的 Bash 方法开销如此之大的原因。真的是由于大量的上下文切换,还是仅仅是来回转换输入并对其进行排序的开销?
我似乎无法理解这些步骤中的哪一个会大大减慢执行速度。对大约 500k 行的文件中的条目进行排序需要几分钟时间,每行大约有 30 个值。
【问题讨论】:
-
似乎没有一个响应者完全阅读/理解您的问题:)
-
您的代码适用于 10 以下的数字。如果您在一行中添加 11,它将无法正确排序。如果需要数字排序,请使用
sort -n。 -
您可以通过创造性地使用tsort 来节省一些周期,但这也取决于您输入数据的类型。
标签: linux bash shell unix sorting