如何在 unix 脚本中使用 awk 添加某些列

如何在 unix 脚本中使用 awk 添加某些列

我必须添加行并选择列。我想用

文件

1 2 3
1 2
1

如果没有参数,脚本应该返回

6 (1st row)
3 (2nd row)
1 (3rd row)

这是我制作的这部分的代码:

awk '{ for(i=1; i<=NF;i++) sum+=$i; print(sum); sum=0 }' $FILE

使用参数 1 和 2(列数),脚本应添加第 1 列和第 2 列中的每一行,因此应返回:

3 (1st+2nd column)
3 (1st+2nd column)
1 (1st+2nd (blank) column))

我唯一需要的是仅对某些行求和的条件

答案1

您可以将变量传递给awk,您的命令将如下所示:

awk -v col1=1 -v col2=2 '{ for(i=1; i<=NF;i++) {if (i == $col1 || i == $col2 ) sum+=$i}; print(sum); sum=0 }' $FILE
  • -v var=value 给程序变量 var 赋值。

您可以添加任意数量的列,只需添加-v colx=value,然后将 ot 添加到条件中|| i == $colx

如果你想将列号传递给 shell 脚本,你可以将它们添加到一个数组中columnsArray,然后创建一个变量columns=$(echo "${columnsArray[@]}"),那么你的命令应该如下所示:

awk -v outCols="$columns" 'BEGIN{split(outCols, cols, " ")} { for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' $FILE

例如

#!/bin/bash
columns=$(echo "$@")
awk -vcolss="$columns" 'BEGIN{split(colss, cols, " ")}{ for(i=1; i<=NF;i++) {if (i in cols ) sum+=$i}; print(sum); sum=0 }' test

会返回:

3
3
1

答案2

好的,有我想要实现的答案:

    #!/bin/bash
    PLIK=$1
    shift
    d=${@}
    awk -v c="$d" 'BEGIN {split(c,a," ")}{c=0; for(i in a) c+=$a[i]; print c}' $FILE

./script.sh file.txt 1 2将返回3 3 1并将./file.sh file.txt 2 3返回,5 2 0这是正确的

相关内容