2つの列と条件に基づいて2つのファイルの交差

2つの列と条件に基づいて2つのファイルの交差

2つのファイルがあります。ファイルは次の内容でタブで区切られます。

col1.     col2     col2       col4
Stef.     123       SE        383
Lena      938       Y          X
John      738       T          Y
Stef      827       uq         hd
Stef      81        tt         vv

列が1つしかない別のファイルがあります。

837
123
839
827

最初のファイルの2番目の列であり、2番目のテキストファイルの唯一の関心のある列である新しいファイルを作成したいと思います。しかし、最初のファイルの最初の列も考慮したいと思います。

私は以下を使用してクロスオーバーを実行できることを知っています。

join <(sort file1) <(sort file2)

しかし、2番目のファイルの最初の列と最初のファイルの2番目の列にどのように割り当てるべきかわからないので、最初のファイルの最初の列に対応する指定された値に基づいて交差しようとしています。たとえば、最初のファイルの最初の列がStefの場合、2つのファイル間の交差部分のみが必要なため、結果ファイルは次のようになります。


col1.     col2     col2       col4
Stef.     123       SE        383
Stef      827       uq         hd

bashとawkを使ってどのようにこれを達成できますか? Pandasでこれを試しましたが、ファイルが非常に大きいため、Jupyterノートブックに読み込むのに時間がかかります。洞察力を高く評価いたします。

私のawkスクリプト:

awk 'NR==FNR{A[$1];next}$2 in A' file2.txt file1.txt > sample.txt

ベストアンサー1

質問を正しく理解したかどうかはわかりませんが、接続パラメータとして使用する列に基づいてファイルを並べ替える必要があります。

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2)

123 Stef. SE 383
827 Stef uq hd

編集:特定の注文が必要な場合:

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2) | awk -F " " '{print $2 " " $1 " " $3 " " $4}'

Stef. 123 SE 383
Stef 827 uq hd

編集:フィルタにgrepを追加しました。たとえば、Stefのみを表示します。 Stefの代わりに(ドットなし)

join -1 2 -2 1 <(sort file1 -k2b,2) <(sort file2) | awk -F " " '{print $2 " " $1 " " $3 " " $4}' | grep "Stef\."

Stef. 123 SE 383

最後の編集(おそらく)

簡単な部分を逃したようです。

awk 'NR==FNR{A[$1];next}$2 in A' file2.txt file1.txt | grep "^Stef"

おすすめ記事