我有以这种格式的1-N文件:
文件1:
1 1
2 5
3 0
4 0
5 0
文件2:
1 5
2 1
3 0
4 0
5 1
作为输出,我想对所有文件的所有第二列求和,因此输出如下所示:
输出:
1 6
2 6
3 0
4 0
5 1
非常感谢。
(或者我最好自动对所有具有相同名称的文件进行此操作,但以不同的编号开头,例如1A.txt,2A.txt,3A.txt作为一个输出和1AD.txt ,2AD.txt,3AD.txt作为下一个输出)
答案 0 :(得分:3)
这样的事情应该有效:
cat *A.txt | awk '{sums[$1] += $2;} END { for (i in sums) print i " " sums[i]; }'
cat *AD.txt | awk '{sums[$1] += $2;} END { for (i in sums) print i " " sums[i]; }'
答案 1 :(得分:2)
快速求和解决方案可以在awk
:
{ sum[$1] += $2; }
END { for (i in sum) print i " " sum[i]; }
通过构建后缀列表然后为它们进行通配,可以最简单地对输入文件进行分组:
ls *.txt | sed -e 's/^[0-9]*//' | while read suffix; do
awk '{ sum[$1] += $2; } END { for (i in sum) print i " " sum[i]; }' *$suffix > ${suffix}.sum
done
答案 2 :(得分:1)
#!/bin/bash
suffixes=$(find . -name '*.txt' | sed 's/.*[0-9][0-9]*\(.*\)\.txt/\1/' | sort -u)
for suffix in ${suffixes}; do
paste *${suffix}.txt | awk '{sum = 0; for (i = 2; i <= NF; i += 2) sum += $i;
print $1" "sum}' > ${suffix}.sums.txt
done
exit 0
答案 3 :(得分:1)
Pure Bash:
declare -a sum
for file in *A.txt; do
while read a b; do
((sum[a]+=b))
done < "$file"
done
for idx in ${!sum[*]}; do # iterate over existing indices
echo "$idx ${sum[$idx]}"
done