如何通过读取 shell 脚本中的 csv 文件将 2 列的总和添加到新列中

how to do the sum of 2 columns adding that into new column by reading the csv file in shell script

我正在尝试执行 shell 脚本来读取 csv 文件并对 2 列求和并添加到名为 total 的新列中。但它没有成功完成。请建议我怎样才能做到这一点。

我输入的 csv 文件

a,b,c
1,2,3
4,5,6

预期输出

a,b,c,total
1,2,3,5
4,5,6,11

这里a是主键

我尝试了下面的代码来实现这个

echo "First arg: 1"
awk "{print   """""" }"
echo "First arg: 2
awk -F, "{$(NF+1)=Null;}1" OFS=, file.csv
awk -F "," "{print ,,,+}"

我的输出是:

C:\Users\inrenan\NIFI\NIFI-1~1.2-B\NIFI-1~1.2>awk -F "," "{print ,,,+}" 
a b c 0
1 2 3 5
4 5 6 11

我唯一遇到的问题是列名

对于非常繁琐的一行:

awk -F',' '{if (NR==1) {printf "%s,total\n",[=10=];} else {sum=0; for(i=2; i<=NF; i++) {sum +=$i}; {printf "%s,%s\n",[=10=],sum;}}}' file.csv

这是您需要的 awk 脚本:

BEGIN{ FS=OFS="," } { print [=10=], (NR==1 ? "total" : +) }

在 Windows.

中使用任何你必须使用的魔法咒语

在 Unix 中你只需这样做:

awk 'BEGIN{ FS=OFS="," } { print [=11=], (NR==1 ? "total" : +) }' input
a,b,c,total
1,2,3,5
4,5,6,11

但我听说 Windows 有一些最好避免的奇怪引用规则,因此我看到的针对 Windows 的常见建议是将脚本保存在名为 [=] 的文件中26=](您也可以在 Unix 中这样做)并将其调用为:

awk -f script.awk input
a,b,c,total
1,2,3,5
4,5,6,11

根据您问题中的最后一个脚本,此 可能 在 Windows 中对您有用,但我真的不知道 Windows 引用规则:

awk "BEGIN{ FS=OFS=\",\" } { print [=13=], (NR==1 ? \"total\" : +) }" input

使用您显示的示例,请尝试执行以下 awk 程序。这里提到一个名为 fieldsawk 变量,它的值为 2,3 我们可以提到用 , 分隔的字段编号,它将负责计算所有这些字段的总和。

awk -v fields="2,3" '
BEGIN{
  FS=OFS=","
  num=split(fields,arr,",")
  for(i=1;i<=num;i++){
    field[arr[i]]
  }
}
FNR==1 { print [=10=],"total"; next }
FNR>1{
  sum=0
  for(i=1;i<=NF;i++){
    if(i in field){ sum+=$i }
  }
  $(NF+1)=sum
}
1
'  Input_file

这是一个获得所需输出的纯批处理文件:

@echo off
setlocal EnableDelayedExpansion

set /P "header=" < input.txt
echo !header!,total
for /f "skip=1 tokens=1-3 delims=," %%a in (input.txt) do (
   set /A "total=%%b+%%c"
   echo %%a,%%b,%%c,!total!
)