E列またはF列が空の場合、または値が0の場合は、B列をコピーします。

E列またはF列が空の場合、または値が0の場合は、B列をコピーします。

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

関連情報