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