他のファイルと共通の列に基づいてタブ区切りのファイルを処理するのに問題があります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
答え2
解決策awk
:
$ awk -F"\t" 'FNR==NR{a[$4];next}; $4 in a' OFS="\t" file1 file2
Column_1 Column_2 Column_3 Column_4
Aa2 Bb2 Cc2 D2