![Bash 中 CSV 文件特定列的算术运算](https://linux22.com/image/53414/Bash%20%E4%B8%AD%20CSV%20%E6%96%87%E4%BB%B6%E7%89%B9%E5%AE%9A%E5%88%97%E7%9A%84%E7%AE%97%E6%9C%AF%E8%BF%90%E7%AE%97.png)
我有一个文件,其内容如下:
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 文件的第三个字段中的数字除以 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
选项,因为我们现在想要使用输入中的标头,并在输出中生成它们。