[英]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.