繁体   English   中英

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

[英]bash - how do you sort within the lines of a text file

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

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

例子:

输入.txt

z y x v t
c b a

输出.txt

t v x y z
a b c

要使用sort行内的单词进行sort ,您需要逐行阅读,并为每行调用一次sort 尽管如此,它变得相当棘手,无论如何,为每一行运行一个sort过程不会非常有效。

使用 Perl 可以做得更好(感谢@glenn-jackman的精彩提示!):

perl -lape '$_ = qq/@{[sort @F]}/' file

如果您有gnu awk则可以使用asort函数在单个命令中完成:

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

这是一种实际使用 linux sort命令(加上xargs )的有趣方式:

while read line; do xargs -n1 <<< $line | sort | xargs; done < input.txt

现在,这提出了几个假设(可能并不总是正确的),但主要思想是xargs -n1获取一行中的所有标记,并在 stdout 中的单独行上发出它们。 此输出通过sort进行管道传输,然后没有参数的最终xargs将它们全部放回一行。

我正在寻找一个神奇的开关,但发现我自己的解决方案更直观:

$ line="102 103 101 102 101"
$ echo $(echo "${line}"|sed 's/\W\+/\n/g'|sort -un)
101 102 103

谢谢!

这有点尴尬,但这仅使用了一个基本的sort命令,因此它可能比需要 GNU sort 的东西更便携:

while read -r -a line; do
  printf "%s " $(sort <<<"$(printf '%s\n' "${line[@]}")")
  echo
done < input.txt

包含echo以插入换行符,默认情况下printf不包含该换行符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM