循环到不同的数字并再次开始循环(Awk/Bash)

循环到不同的数字并再次开始循环(Awk/Bash)

可以在下面的 txt 文件中使用循环遍历整个列总和:

101     10
101     10
101     10.10
101     13
101     10
101     10
102     10.140
102     10
102     10
102     0.90
102     10
103     10
104     10
111     11
111     11
111     5.485e+12
111     11


 awk '{sum+=$2;} END{print sum;}' file1.txt > sum_a.txt

现在我想做一些不同的事情。例如,我想在第一列编号相同时对第二列求和并重新开始。可以使用 saw[$1] 来完成吗?

awk '{ seen[$1] += $2 } END { for (i in seen) print i, seen[i] }' file1.txt

其中 $1 被视为索引值。

我无法使用它来运行它seen[$1]。或者还有其他好的方法来进行循环吗?

结果会是这样的:

101     63.10
101     63.10
101     63.10
101     63.10
101     63.10
101     63.10
102     40. 90

等等...直到整个专栏。

答案1

$ awk 'NR==FNR{sum[$1]+=$2; next} {print $1, sum[$1]}' file file
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
102 41.04
102 41.04
102 41.04
102 41.04
102 41.04
103 10
104 10
111 5485000000033
111 5485000000033
111 5485000000033
111 5485000000033

答案2

如果只想使用 awk 仅使用一个输入文件:

 $ awk -v c=1 '{ a[$1]+=$2;b[c]=$1;c+=1} END { for( i=1;i<=NR;i++ ){key=b[i]; print key" "a[key]} }' file1.txt  
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
102 41.04
102 41.04
102 41.04
102 41.04
102 41.04
103 10
104 10
111 5485000000033
111 5485000000033
111 5485000000033
111 5485000000033

相关内容