各行の単語を並べ替え、ファイルをその場で編集する

各行の単語を並べ替え、ファイルをその場で編集する

ファイルを 1 行ずつ読み取り、各行を編集して、それらの行を別のファイルに保存します。

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 

答え1

spongeで述べたように、を使うこともできます。stdinまたはファイルをバッファリングできるプログラム入力がリダイレクトされるのと同じ方法で、ループ全体をパイプすることができます。

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

答え2

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

大文字と小文字を無視コマンドラインまたは始めるルール

split($0, w, " ");- 行を単語に分割します

asort(w);- 配列の値(単語)をソートする

for(i in w) {l=l" "w[i]}- ソートされた単語を1行に連結する

関連情報