別のファイルで同じ列を持つ行をどのように識別し、特定の列を印刷して元のファイルに追加できますか? [閉鎖]

別のファイルで同じ列を持つ行をどのように識別し、特定の列を印刷して元のファイルに追加できますか? [閉鎖]

以下は、私たちが持っているテキストファイルです。

ファイル1.txt

A B C D
4 9
5 8

ファイル2.txt:

H I J K L M N O P Q R
1 2 3 5 8 9 5 3 3 2 4
4 7 8 9 5 6 8 9 0 8 7
7 8 0 7 4 7 7 9 0 6 7
2 7 9 5 7 9 0 7 6 5 4

file1.txtの列Aがfile2.txtの列Lと一致する場合、file2.txtから2つの列(HとN)を抽出して表示する出力テキストファイルは次のようになります。

出力.txt

A B C D
4 9 7 7
5 8 4 8

どうすればいいですか?

答え1

grepを使用すると不可能ですが、awkを使用すると可能です。

$ awk 'NR==1   {print $0;next}              # Print header
       NR==FNR {a[$1]=$2;next}              # collect data from file1.txt
               { if($5 in a)                # If column L match
                 { print($5,a[$5],$1,$7) }  # print columns (H and N)
               }
      ' file1.txt file2.txt

一行で:

$ awk 'NR==1{print $0;next} NR==FNR{a[$1]=$2;next} {if($5 in a){print($5,a[$5],$1,$7)}}' file1.txt file2.txt

A B C D
5 8 4 8
4 9 7 7

順序はフィールドに表示される順序と同じですfile2.txt
ソートが必要な場合は、ソート手順を追加してください。

答え2

段階的に説明します。

  1. ファイルの並べ替え 1

    sort file1.txt > file1.sorted.txt

  2. file2から興味深い部分を取得してソートします。

    awk '{print $5,$1,$7}' file2.txt | sort > file2_of_interest.txt

  3. キーに基づいて2つの出力を接続します(2つのファイルの列1)。

    join file1.sorted.txt file2_of_interest.txt -1 1 -2 1

間接参照を使用してこれらの3つの手順を組み合わせることができますが、最終的には少なくとも1つのファイルの解析を完了する必要があります。 file2.txtのL列が一意でないか、file1.txtの列1が一意ではないという懸念もあります。キーを一意にするビジネスロジックを入れて、これらの問題を解決する必要があります。

関連情報