BashのCSVファイルの特定の列の算術演算

BashのCSVファイルの特定の列の算術演算

次の内容を含むファイルがあります。

A,10,20,30,40,50
B,20,40,10,30,60
C,30,50,20,40,10
D,40,50,20,10,30

上記のCSVファイルの特定の列(例:列3)に対していくつかの算術演算(例:10で除算)を実行したいと思います。したがって、次のように書き込みます。

A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

これはどのように達成できますか?

答え1

この試み:

% awk -F , -v OFS=, '$3/=10' <file
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

答え2

もしあなたなら本物Bashでこれを行うには、次のようにします。

$ while IFS="," read a b c rest; do 
    printf "%s,%s,%s,%s\n" $a $b $((c/10)) $rest; 
  done < file.csv 
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

これは単純な整数演算では機能しますが、bashは浮動小数点数を処理できないため、整数ではなく演算しようとすると失敗します。ひどい。 Bashは実際に仕事に最適なツールではありません。

答え3

Millerを使用して、ヘッダーなしのCSVファイルの3番目のフィールドの数字を10で除算します。

$ mlr --csv -N put '$3 /= 10' file
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

CSVデータにヘッダが含まれていなくても大丈夫です。その場合は、名前付きヘッダーを使用できます。

$ cat file
Alpha,Number,Medium,Ch,Beets,Returns
A,10,20,30,40,50
B,20,40,10,30,60
C,30,50,20,40,10
D,40,50,20,10,30
$ mlr --csv put '$Medium /= 10' file
Alpha,Number,Medium,Ch,Beets,Returns
A,10,2,30,40,50
B,20,4,10,30,60
C,30,5,20,40,10
D,40,5,20,10,30

-Nこれで、入力のヘッダーを使用して出力から生成したいので、このオプションを削除しました。

関連情報