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
最初の引数として指定したので、最初に読み取られます。は file1
2 番目に読み取られます。
FNR==NR{a[$1]=$2;next}
NR
awk
は、 がこれまでに読み込んだ行数であり、は、現在のファイルからこれまでに読み込んだFNR
行数です。したがって、 の場合、最初に指定されたファイル をまだ読み込んでいます。 内のすべての行に対して、 を割り当てます。awk
FNR==NR
file2
file2
a[$1]=$2
a
ここでは、連想配列は、 file2 の最初の列をキーとして使用して、 file2 の 2 番目の列 ( と表記) を配列の値としてa[$1]=$2
保存することを意味します。$2
a
$1
next
awk
残りのコマンドをスキップして次の行からやり直すように指示します。($1 in a) {print $1,a[$1],$2}
ここまで来たら、2 番目のファイルを読み込んでいることになります: 。配列 の内容によって決定される の
file1
行の最初のフィールドを見つけた場合、両方のファイルのフィールド 2 の値を含む行を出力します。file2
a
答え2
私は awk ソリューションが好きですが、これはもっと簡単かもしれないと思います:
sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2
このオプションは-o
、最初のファイルの最初のフィールド、2 番目のファイルの 2 番目のフィールド、および最初のファイルの 2 番目のフィールドとして選択する形式を上書きします。
答え3
2 番目のファイルをFile2
1 番目のファイルに結合しますFile1
。
join <(sort -k1 file2) <(sort -k1 file1)