如何通过读取 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
程序。这里提到一个名为 fields
的 awk
变量,它的值为 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!
)
我正在尝试执行 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
程序。这里提到一个名为 fields
的 awk
变量,它的值为 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!
)