2つの入力ファイルの列を含むファイルを作成したいと思います。ファイル1は次のようになります。
aa 32
bb 15
cc 78
ファイル2は次のようになります。
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
これは、File1を読み込み、File2の最初のフィールドに行の最初のフィールドがある場合は、2つの列でFile2の対応する行を印刷し、最初のフィールドを含む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
二度目に読んだ内容でした。
FNR==NR{a[$1]=$2;next}
NR
awk
これまでに読み込んだ行数は、FNR
現在のファイルからこれまで読み込んだ行数です。awk
したがってFNR==NR
、我々はまだ最初の名前付きファイルを読んでいますfile2
。の各行にをfile2
割り当てますa[$1]=$2
。ここ
a
では連想配列file2の最初の列をキーとして使用し、a[$1]=$2
file2の2番目の列(で示される)を$2
配列の値として保存することを意味します。a
$1
next
awk
残りのコマンドをスキップし、次の行から始まることを示します。($1 in a) {print $1,a[$1],$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 番目のフィールド、および 1 番目のファイルの 2 番目のフィールドに対して選択した形式をオーバーライドします。
答え3
2番目のファイルはFile2
最初のファイルですFile1
。
join <(sort -k1 file2) <(sort -k1 file1)