使用linux命令sort
,如何对文本文件中的行进行排序?
正常sort
交换行,直到他们重新排序,而我想交换行中的单词,直到他们排序。
示例:
INPUT.TXT
z y x v t
c b a
Output.txt的
t v x y z
a b c
答案 0 :(得分:3)
使用sort
对行内的单词进行排序,
你需要逐行阅读,
并为每一行拨打sort
一次。
它变得相当棘手,
在任何情况下,
为每一行运行一个sort
流程并不是非常有效。
你可以通过使用Perl做得更好(感谢@glenn-jackman获得了很棒的提示!):
perl -lape '$_ = qq/@{[sort @F]}/' file
答案 1 :(得分:2)
如果你有gnu awk
,那么可以使用asort
function在一个命令中完成:
awk '{for(i=1; i<=NF; i++) c[i]=$i; n=asort(c);
for (i=1; i<=n; i++) printf "%s%s", c[i], (i<n?OFS:RS); delete c}' file
t v x y z
a b c
答案 2 :(得分:1)
这是一种实际使用linux sort
命令(加xargs
)的有趣方式:
while read line; do xargs -n1 <<< $line | sort | xargs; done < input.txt
现在,这做了几个假设(可能并不总是如此),但主要思想是xargs -n1
将一行中的所有标记放在一起并在stdout中的不同行上发出它们。此输出通过sort
传输,然后最终xargs
没有参数将它们全部放回一行。
答案 3 :(得分:1)
我一直在寻找一个神奇的开关,但发现我自己的解决方案更直观:
$ line="102 103 101 102 101"
$ echo $(echo "${line}"|sed 's/\W\+/\n/g'|sort -un)
101 102 103
谢谢!
答案 4 :(得分:0)
它有点尴尬,但这只使用了一个基本的sort
命令,所以它可能比需要GNU排序的东西更便携一些:
while read -r -a line; do
printf "%s " $(sort <<<"$(printf '%s\n' "${line[@]}")")
echo
done < input.txt
包含echo
以插入换行符,默认情况下printf
不会包含换行符。