web-dev-qa-db-ja.com

awk-2つのファイルの2つの列を比較し、共通の行を出力する

このプラットフォームで既に答えられた同じ質問がありますが、すべての解決策を数時間試しましたが、間違いを見つけることができません。だから、私が間違っていることについてのヒントや助けをいただければ幸いです。

こちら https://unix.stackexchange.com/questions/216511/comparing-the-first-column-of-two-files-and-printing-the-entire-row-of-the-secon そしてここ どのようにして2つのファイルのデータを比較して、共通および一意のデータを識別することができますか? ファイル1の列1に一致するファイル2の行をフィルターで除外したい2つのファイルがあります。私の意見では、同じ質問に対して提案された解決策は機能するはずですが、残念ながら機能しません。ファイルはタブで区切られています。

file_1.txt

Apple
great
see
tree

file_2.txt

Apple    5.21      Noun
around   6.21      Adverb
great    2         Adjective
bee      1         Noun
see      7.43      Verb
tree     3         Noun

出力は次のようになります。

Apple    5.21      Noun
great    2         Adjective
see      7.43      Verb
tree     3         Noun

Comm -12を試しましたが、

awk (e.g awk 'NR==FNR{a[$1];next} ($1 in a)' file_1.txt file_2.txt > output.txt)

これはばかげた質問かもしれないことを知っています。事前に謝罪します。しかし、私はそれを理解することができないようです。

1
dani_anyman

その方法の1つは次のようになります。

awk '   BEGIN { while ((getline <"file2.txt") > 0) {REC[$1]=$0}}
    {print REC[$1]}' <file1.txt

開始時のgetlineはfile2.txtを読み取り、それを最初のレコードによってインデックス付けされた配列RECに保存します。

次に、コードの「メイン」セクションはfile1.txtの内容を読み取り、行の最初のWordを使用して、現在RECに格納されているfile2.txtから適切な行を検索します。

出力例:

Apple    5.21      Noun
great    2         Adjective
see      7.43      Verb
tree     3         Noun 
3
Nick Sillito