1

我有这种格式的 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 作为下一个输出)

4

4 回答 4

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]; }'
于 2012-04-18T21:55:17.543 回答
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
于 2012-04-18T21:48:05.477 回答
1

纯重击:

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
于 2012-04-19T17:47:33.527 回答
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
于 2012-04-19T00:11:45.433 回答