異なるファイル内の共通文字列による合計

異なるファイル内の共通文字列による合計

file1ユーザーがファイル内に出現する回数を記録したファイルがあります。次のようになります。

4 userC
2 userA
1 userB

また、ユーザーやその他の情報を含む別のファイルもありますfile2:

userC, degree2
userA, degree1
userB, degree2

そして、各度数ごとにユーザーが出現した回数を示す出力が欲しいです:

5 degree2
2 degree1

答え1

純粋なawk

$ awk -F'[, ]' 'NR==FNR{n[$2]=$1;next}{m[$3]+=n[$1]}
    END{for(i in m){print i " " m[i]}}' \
    file1 file2
degree1 2
degree2 5

または、次のようなスクリプトに組み込むこともできます。

#!/usr/bin/awk -f 
BEGIN {
    FS="[, ]"
}
{
    if (NR == FNR) {
        n[$2] = $1;
        next;
    } else {
        m[$3] += n[$1];
    }
}
END {
    for (i in m) {
        print i " " m[i];
    }
}

まず、フィールド区切り文字をコンマとスペースの両方 (つまり、BEGINブロックまたは-Fコマンド ライン オプション) に設定します。

次に、最初のファイル (イディオムFNR == NR) を解析するときに、ユーザー名でインデックス付けされた配列にユーザーの接続数を入れます。次のファイルを解析するときに、ユーザー グループでインデックス付けされた配列に各ユーザーの接続数を追加します。

最後に(ENDブロックは)配列全体をスキャンし、キーと値のペアを出力します。

関連情報