【问题标题】:how to do the sum of 2 columns adding that into new column by reading the csv file in shell script如何通过读取shell脚本中的csv文件来将2列的总和添加到新列中
【发布时间】:2021-12-21 07:32:36
【问题描述】:

我正在尝试实现 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 $3 $2 """""" $1}"
echo "First arg: 2
awk -F, "{$(NF+1)=Null;}1" OFS=, file.csv
awk -F "," "{print $1,$2,$3,$2+$3}"

我的输出是:

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

只有我面临的问题是列名

【问题讨论】:

  • "但是没有成功。"你试过什么没用?
  • @SamBob 请再次检查我更新的问题
  • 主持人:这个问题与当前标记的stackoverflow.com/questions/62980230/… 不是重复的。这个问题分别对每一行求和,那个问题对所有列求和

标签: windows csv batch-file awk cmd


【解决方案1】:

这是您需要的 awk 脚本:

BEGIN{ FS=OFS="," } { print $0, (NR==1 ? "total" : $2+$3) }

做任何你必须在 Windows 中使用它的魔法咒语。

在 Unix 中你只需要这样做:

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

但我听说 Windows 有一些最好避免的奇怪引用规则,因此我看到的针对 Windows 的常见建议是将脚本保存在名为 script.awk 的文件中(在 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 $0, (NR==1 ? \"total\" : $2+$3) }" input

【讨论】:

    【解决方案2】:

    使用您展示的示例,请尝试关注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 $0,"total"; next }
    FNR>1{
      sum=0
      for(i=1;i<=NF;i++){
        if(i in field){ sum+=$i }
      }
      $(NF+1)=sum
    }
    1
    '  Input_file
    

    【讨论】:

      【解决方案3】:

      对于非常繁琐的单行:

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

      【讨论】:

      • 我正在使用.bat 文件编写shell 脚本,我遇到了上述错误,我将' 更改为" 但面临同样的问题
      • 我猜你是在 Windows 中运行的。您确定您正在运行bash 而不是cmd.exe?你用什么运行你的脚本(哪个程序和什么命令)?
      • 是的,我使用.bat格式文件在windows中运行,我更新了我的代码输出,请检查它
      • “在 Windows 中”来自 cmd?电源外壳? WSL?如果前两个中的任何一个都不是标记的 bash 问题。此解决方案适用于 bash。
      【解决方案4】:

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

      @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!
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-03
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        相关资源
        最近更新 更多