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

出力として、すべてのファイルの 2 番目の列をすべて合計したいので、出力は次のようになります。

出力:

1 6
2 6
3 0
4 0
5 1

どうもありがとう。

(代わりに、同じ名前を持つが異なる番号で始まるすべてのファイルでこの操作を自動的に行うのが最善です。たとえば、1A.txt、2A.txt、3A.txt を 1 つの出力として、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 に答える