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"