Text-Processing
對每一行的單詞進行排序,就地編輯文件
我逐行讀取文件並編輯每一行並將這些行保存在單獨的文件中。
while read -r line do newline=$(echo $line | sed -r 's/\</\n/g' | sort | tr '\n' ' ') echo "$newline" >> newfile done < "$filename"
但我想
$filename
用新行替換原始行。我讀到我可以使用cat filename... | xargs -n1 command
,sed -i ...
但直到現在我的踪跡都失敗了。這是一個範例輸入:
1.e4 e5 2.Nf3 Nc6 3. 1.d4 d5 2.e4 dxe4 3. 1.e4 e5 2.Nf3 Nf6 3.
這是預期的輸出:
1. 2. 3. e4 e5 Nc6 Nf3 1. 2. 3. d4 d5 dxe4 e4 1. 2. 3. e4 e5 Nf3 Nf6
您可以使用
sponge
,如可以緩衝標準輸入或文件的程序中所述。您可以將整個循環通過管道傳遞給它,就像將輸入重定向到它一樣:while read -r line ; do echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ; echo done < filename | sponge filename
使用 Perl,也可以這樣做(空格的數量不同):
perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename
awk方法:
awk 'BEGIN{IGNORECASE=1;}{ gsub(/\./,". ", $0); split($0, w, " "); asort(w);l=""; for(i in w) {l=l" "w[i]} print l}' file
輸出:
1. 2. 3. e4 e5 Nc6 Nf3 1. 2. 3. d4 d5 dxe4 e4 1. 2. 3. e4 e5 Nf3 Nf6
可以在命令行或BEGIN規則中設置IGNORECASE
split($0, w, " ");
- 將行拆分為單獨的單詞
asort(w);
- 排序數組值(字)
for(i in w) {l=l" "w[i]}
- 將排序的單詞連接成一行