次の内容を含むファイルがあります。
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
これで、入力のヘッダーを使用して出力から生成したいので、このオプションを削除しました。