2

私はこのように見える2つのファイルを持っています:

file1

aaa 5
bbb 2
ccc 9
ddd 46
eee 89
fff 56

ファイル2

aaa 54
bbb 8
ccc 16
ddd 4
eee 66
fff 9

特定の列の合計が必要です(たとえば、両方のファイルのaaaの合計、cccの合計+ dddの合計、bbbの合計+eeeの合計+fffの合計)

たとえば、awkでこれを行う簡単な方法はありますか?

4

4 に答える 4

1

単に合計が必要な場合は、純粋なbashで実行できます(ここでは連想配列を使用するため、bash 4が必要です)。

declare -A sums
while read name val1 val2; do
  sums[$name]=$(( val1 + val2 ))
done < <(join -j 1 file1 file2)

echo "Sum of aaa: ${sums[aaa]}"
echo "Sums of ccc and ddd: $(( ${sums[ccc]} + ${sums[ddd]} ))"
echo "Sums of bbb, eee, and fff: $(( ${sums[bbb]} + ${sums[eee]} + ${sums[fff]} ))"
于 2012-08-01T14:41:27.103 に答える
1

aaaの合計の例:

kent$  awk 'NR==FNR{a[$1]=$2;next;}{a[$1]+=$2}END{print "sum of aaa:",a["aaa"]}' file1 file2
sum of aaa: 59

パーツを変更して、END{xxx}さまざまな種類の「合計」を取得できa["bbb"]+a["eee"]ます:)たとえば、bbb+eeeの合計が表示されます

于 2012-08-01T14:48:17.717 に答える
0

1つのファイルに連結して、以下を使用します。

awk '{a[$1]+= $2;}END{for(i in a){print i,a[i];}}' file

catからawkに出力をパイプできます。

cat file1 file2 | awk '...

出力を並べ替える場合は、パイプで並べ替えます。

于 2012-08-01T14:48:41.843 に答える
0

私も同じことをしていますが、ファイルが大きいので、awk配列を使用して連結して合計するのは良い考えではないと思います。

私は実際にこれを使用しています:

join -t$'\t' --check-order -a 1 -a 2 -e 0 -1 1 -2 1 file1 file2 > joined.tmp
awk 'BEGIN{FS="\t"; OFS="\t"}{print $1, $2+$3}' joined.tmp > merged.txt

より高速な方法を探していましたが、巨大なファイルの場合、このソリューションは前の回答で提案されたものよりも優れていると思います。

于 2014-08-21T09:04:38.517 に答える