単語リストを使用して単一の列を特定する方法

単語リストを使用して単一の列を特定する方法

単一の列と単語のリストの一致に基づいて、ファイルからいくつかの行を抽出したいと思います。

awkでは、次のようなものを使用できます。

awk '$5 == "someword" {print}' file.txt

私は次のようにgrepを使用できることを知っています。

grep -f listofwords.txt file.txt

ファイルの単一列に基づいて単語のリストを特定する方法を教えてください。

はい

A   something  something2
B   something2 something3
C   something3 something4
D   something4 something5
G   something5 something6

私が望むのは、列2に基づく単語ベクトルです。

something
something4

希望の出力:

A   something  something2
D   something4 something5

答え1

私にとって、これはawkの一般的なユースケースのようです。

awk 'NR == FNR { keywords[$1]=1; next; }
               { if ($2 in keywords) print; }' listofwords.txt file.txt

"NR == FNR"条件がtrueの場合、2つのファイルをawkに渡します(レコード数は現在のファイルのレコード数と同じです。これは最初のファイルを読み込んでいることを意味します)。その後、リストを保存します。 「キーワード」配列のキーワードを選択し、次のレコードに移動します。別の(包括的な)条件は、(file.txtの)フィールド2がキーワードの1つであることを確認し、そうであればその行を印刷します。

答え2

whileリスト内の各文字列には単語の境界が必要なので、ループを使用できます。

while read -r list; do
    grep -E "^[^ ]* +$list\>[^ ]* +.*$" input_file
done < list_file
A   something  something2
D   something4 something5

または

$ grep -Ee '^[^ ]* +something\>[^ ]* +.*$' -e '^[^ ]* +something4[^ ]* +.*$' input_file
A   something  something2
D   something4 something5

関連情報