フィールドの一致に基づいて2つのファイルを結合する

フィールドの一致に基づいて2つのファイルを結合する

2 つの入力ファイルの列を含むファイルを作成したいと思います。ファイル 1 は次のようになります。

aa 32
bb 15
cc 78

ファイル2は次のとおりです。

fa 19
bc 23
cc 50
de 28
aa 45
bb 31

タスクは、File1 を読み取り、行の 1 番目のフィールドが File2 の 1 番目のフィールド内に存在する場合は、File2 のその行を両方の列とともに印刷し、1 番目のフィールドを含む File1 の 2 番目の列のエントリを追加することです。

出力は次のようになります。

aa 45 32
bb 31 15
cc 50 78

スクリプトには awk が推奨されます。

答え1

$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78

説明:

awk暗黙的に各ファイルを 1 行ずつループします。これをfile2最初の引数として指定したので、最初に読み取られます。は file12 番目に読み取られます。

  • FNR==NR{a[$1]=$2;next}

    NRawkは、 がこれまでに読み込んだ行数であり、は、現在のファイルからこれまでに読み込んだFNR行数です。したがって、 の場合、最初に指定されたファイル をまだ読み込んでいます。 内のすべての行に対して、 を割り当てます。 awkFNR==NRfile2file2a[$1]=$2

    aここでは、連想配列は、 file2 の最初の列をキーとして使用して、 file2 の 2 番目の列 ( と表記) を配列の値としてa[$1]=$2保存することを意味します。$2a$1

    nextawk残りのコマンドをスキップして次の行からやり直すように指示します。

  • ($1 in a) {print $1,a[$1],$2}

    ここまで来たら、2 番目のファイルを読み込んでいることになります: 。配列 の内容によって決定される のfile1行の最初のフィールドを見つけた場合、両方のファイルのフィールド 2 の値を含む行を出力します。file2a

答え2

私は awk ソリューションが好きですが、これはもっと簡単かもしれないと思います:

sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2

このオプションは-o、最初のファイルの最初のフィールド、2 番目のファイルの 2 番目のフィールド、および最初のファイルの 2 番目のフィールドとして選択する形式を上書きします。

答え3

2 番目のファイルをFile21 番目のファイルに結合しますFile1

join <(sort -k1 file2) <(sort -k1 file1)

関連情報