簡體   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