ファイルを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
の説明に従って使用できます。標準入力またはファイルをバッファリングできるプログラム。入力をリダイレクトするのと同じように、ループ全体をパイプに接続できます。
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 '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行にリンク