bash - 如何在文本文件的行内排序

时间:2017-11-27 21:31:27

标签: bash sorting text-files

使用linux命令sort,如何对文本文件中的行进行排序?

正常sort交换行,直到他们重新排序,而我想交换行中的单词,直到他们排序。

示例:

INPUT.TXT

z y x v t
c b a

Output.txt的

t v x y z
a b c

5 个答案:

答案 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不会包含换行符。