![循环到不同的数字并再次开始循环(Awk/Bash)](https://linux22.com/image/170826/%E5%BE%AA%E7%8E%AF%E5%88%B0%E4%B8%8D%E5%90%8C%E7%9A%84%E6%95%B0%E5%AD%97%E5%B9%B6%E5%86%8D%E6%AC%A1%E5%BC%80%E5%A7%8B%E5%BE%AA%E7%8E%AF%EF%BC%88Awk%2FBash%EF%BC%89.png)
可以在下面的 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