他のファイルと共通の列に基づいてタブ区切りのファイルから行を削除する

他のファイルと共通の列に基づいてタブ区切りのファイルから行を削除する

他のファイルと共通の列に基づいてタブ区切りのファイルを処理するのに問題がありますColumn_4

最初のファイルは非常に小さいかもしれませんが(100行未満)、2番目のファイルは80,000個をはるかに超えています(両方とも約30列)。

file1.txt:

Column_1    Column_2    Column_3    Column_4
A1          B1          C1          D1
A2          B2          C2          D2
A3          B3          C3          D3

file2.txt:

Column_1    Column_2    Column_3    Column_4
Aa1          Bb1          Cc1          Dd1
Aa2          Bb2          Cc2          D2
Aa3          Bb3          Cc3          Dd3

desired_output.txt:

Column_1    Column_2    Column_3    Column_4
Aa2          Bb2         Cc2          D2

cut一連の、grepなどを試みたがawk正しい結果が得られないようです。

最終目標は、一致しないすべての行を削除し、file2.txt出力をfile1.txt

ベストアンサー1

あなたの質問をよく理解したら、これは一般的な問題のように聞こえます。 Join("共通フィールドの行の結合")例:

join --header -j 4 -t $'\t' file1.txt file2.txt

一致する各行には7つの列があります。

これが私が得た結果です(少し変更されたデータ、以下を参照)。

Column_4    Column_1    Column_2    Column_3    Column_1    Column_2    Column_3
D2  A2  B2  C2  Aa2 Bb2 Cc2
D3  A3  B3  C3  Aa3 Bb3 Cc3
D8  A8  B8  C8  Aa8 Bb8 Cc8

(申し訳ありません。ここのラベルはあまりきれいではありません。)

Column_4 は一致する値で、最初に来ます。要件に応じて、他の列の値を比較できます。あなたの目標

2番目のテーブル列のみが必要な場合は、次を使用してください。

join --header  -j 4 -o 2.1,2.2,2.3,2.4 -t $'\t' file1.txt file2.txt 

ただし、join入力ファイルはソートする必要があるため、sort最初にそのファイルを渡して4番目のフィールドでソートする必要があります。

join --header  -j 4 -o 2.1,2.2,2.3,2.4 -t $'\t' <(sort -k4 file1.txt) <(sort -k 4 file2.txt)

より良いデモンストレーションのために少し異なるソースファイルを提案します(うーん、それは編集する前です)。

ファイル1:

Column_1    Column_2    Column_3    Column_4
A0  B0  C0  D0
A2  B2  C2  D2
A3  B3  C3  D3
A8  B8  C8  D8

ファイル2:

Column_1    Column_2    Column_3    Column_4
Aa1 Bb1 Cc1 D1
Aa2 Bb2 Cc2 D2
Aa3 Bb3 Cc3 D3
Aa4 Bb4 Cc4 D4
Aa5 Bb5 Cc5 D5
Aa6 Bb6 Cc6 D6
Aa7 Bb7 Cc7 D7
Aa8 Bb8 Cc8 D8
Aa9 Bb9 Cc9 D9

おすすめ記事