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 文件的第三个字段中的数字除以 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选项,因为我们现在想要使用输入中的标头,并在输出中生成它们。

相关内容