次のデータセットが終了するまで、1行、3行、5行などのすべてのフィールドで、値3と4をそれぞれ0と1に置き換えたいと思います。
2 4 3 0
2 4 3 0
3 0 4 4
3 0 4 4
4 2 4 3
4 2 4 3
2 3 4 2
2 3 4 2
したがって、望ましい結果は次のとおりです。
2 1 0 0
2 4 3 0
0 0 1 1
3 0 4 4
1 2 1 0
4 2 4 3
2 0 1 2
2 3 4 2
これを行うには、次のコードを使用しています。
awk '{for (i = 1; i <= NR; i=(i+2))
if($i == 3) {$i = 0}
if($i == 4) {$i = 1}
}
END {print $0}' b.temp
ただし、このコードの出力は、b.tempファイルの最後の行(2 3 4 2)の値のみです。
どうすればいいですか?コードは行数とフィールド数に制限がないはずです。解決策は、awk、sed、またはシェルスクリプトの他の代替方法です。
事前にありがとう
ベストアンサー1
sedを使用してください:
sed 'y/34/01/;n' file
意味は次のとおりです
- この行の3と4を0と1に置き換えて印刷します。
- 次の行をインポートして印刷します。
- 次の行を取得してループを繰り返します。
ただし、データに(たとえば14)が含まれている場合、11に変換すると失敗します。この問題を解決するには、次を選択してください。
sed 's/\<4\>/1/g;s/\<3\>/0/g;n' file