我必须添加行并选择列。我想用
文件
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
这是正确的