bashコマンドとawkコマンドやその他のコマンドを使用して変更したいCSVファイルがあります。
たとえば、E列またはF列が空の場合、または値が0の場合は、B列をコピーしたいと思います。
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF
11 12 13 14 15 0
出力:
AAAA, BBBB, CCCC, DDDD, EEEE, FFFF
11 12 13 14 15 12
どうすればいいですか?
アップデート:cat user.csvを実行しましたが、これが表示されました。
740.58,0,740.58,0,740.58
2452.84,0,2452.84,0,2452.84
898.23,0,898.23,0,898.23
227.57,0,227.57,0,227.57
735.02,0,735.02,0,735.02
640.5,0,640.5,0,640.5
469.31,0,469.31,0,469.31
3744.25,0,3744.25,0,3744.25
462.15,0,462.15,0,462.15
198.79,0,198.79,0,198.79
437.58,0,437.58,0,437.58
515.44,0,515.44,0,515.44
LibreOfficeではこんな感じ.
だから私がしたいのは、C列の情報をB列に変更することです。 B列のすべての情報が0であれば、0でなければ何も変更しないで説明します。
申し訳ありませんが、私の英語力はあまり良くありません:c
アップデート:ステートメントが次の場合:
if [[ $2 == 0 ]]; then echo "列 3 を列 2 にコピー" awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 } 1' user.csv > user1.csv else if [[ $4 == 0 ]] ; then echo "列 5 を 4 にコピー" awk -F , 'BEGIN { OFS = FS } $4 == 0 { $4 = $5 }' csv > user1.csv fi fi
答え1
gawk '
BEGIN {FS = OFS = "\t"}
!$5 {$5 = $2}
!$6 {$6 = $2}
1
' input.tsv
出力が正しい場合はもう一度実行してください。gawk -i inplace '...' input.tsv
答え2
$ awk -F , 'BEGIN { OFS = FS } $2 == 0 { $2 = $3 }; 1' user.csv
740.58,740.58,740.58,0,740.58
2452.84,2452.84,2452.84,0,2452.84
898.23,898.23,898.23,0,898.23
227.57,227.57,227.57,0,227.57
735.02,735.02,735.02,0,735.02
640.5,640.5,640.5,0,640.5
469.31,469.31,469.31,0,469.31
3744.25,3744.25,3744.25,0,3744.25
462.15,462.15,462.15,0,462.15
198.79,198.79,198.79,0,198.79
437.58,437.58,437.58,0,437.58
515.44,515.44,515.44,0,515.44
awk
これは、2番目のフィールドの数値が0の場合、各レコード(行)の2番目のフィールド(列)を3番目のフィールドの値に設定するために使用されます。
このBEGIN
ブロックは、単に出力フィールド区切り文字を入力フィールド区切り文字(コマンドラインで設定したコンマ-F
)に設定します。
尾は、すべてのレコードが無条件に印刷される1
のと同じです。{ print }
質問の更新に関して:列2が0の場合(上記のように)列3を列2にコピーし、同時に列4が0の場合、列4に列5をコピーするには、上記のコードは簡単に次のように展開されます。
awk -F , 'BEGIN { OFS = FS }
$2 == 0 { $2 = $3 }
$4 == 0 { $4 = $5 }; 1' user.csv