2つの入力ファイルの列を含むファイルを作成します。 File1は次のようなものです。
aa 32
bb 15
cc 78
File2は次のとおりです。
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
タスクは、File1を介して読み取られ、行の最初のフィールドがFile2の最初のフィールドの中に存在する場合、File2のその行を両方の列とともに印刷し、最初のフィールドを含むFile1の2番目の列エントリを追加します。
出力は次のようになります。
aa 45 32
bb 31 15
cc 50 78
スクリプトにはawkが推奨されます。
$ 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
を指定したため、最初に読み取られます。 file1
は2番目に読み取られます。
FNR==NR{a[$1]=$2;next}
NR
はawk
がこれまでに読み取った行数であり、FNR
はawk
が現在のファイルからこれまでに読み取った行数です。したがって、FNR==NR
の場合でも、最初の名前付きファイルfile2
を読み取っています。 file2
のすべての行に、a[$1]=$2
を割り当てます。
ここで、a
は連想配列であり、a[$1]=$2
は、file2の2番目の列($2
と表記)を配列a
の値として保存することを意味します。 file2の最初の列、$1
をキーとして。
next
は、残りのコマンドをスキップして次の行からやり直すようにawk
に指示します。
($1 in a) {print $1,a[$1],$2}
ここに到達した場合は、2番目のファイルfile1
を読み取っていることを意味します。配列a
の内容によって決定されるfile2
の行の最初のフィールドを確認した場合、両方のファイルからフィールド2の値を含む行を出力します。
私はawkソリューションが好きですが、これはもっと簡単かもしれません:
sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2
オプション -o
は、最初のファイルの最初のフィールド、2番目のファイルの2番目のフィールド、最初のファイルの2番目のフィールドとして選択する形式を上書きします。
2番目のファイルに結合、File2
を最初のファイルに、File1
。
join <(sort -k1 file2) <(sort -k1 file1)