awk / whileを使用してリストを使用して複数の列を含むファイルをフィルタリングしますか?

awk / whileを使用してリストを使用して複数の列を含むファイルをフィルタリングしますか?

おそらくここで何か愚かなことをしているようです(awkに初めて触れる人)...

複数の列を持つBigFileがあり、名前リスト(NamesList)に基づいて行をフィルタリングしたいと思います。この名前はファイルの4番目の列に含まれています。

whileループを試してください

while read -r line; do 
cat BigFile.txt | awk '{if ($4=="$line") print $0;}' >> Output.txt
done < NamesList.txt

フィルタ処理された行をOutput.txtとして印刷します。これは私に空のファイルを与えます:(

私は何が間違っていましたか?この問題を解決するより良い方法はありますか?

ベストアンサー1

実装の主な問題は、"$line"awk式を含む単一引用符内にあるため、シェルによって拡張されないことです。

あなたできる$line次のようにawkを渡します。

cat BigFile.txt | awk -v line="$line" '{if ($4==line) print $0;}' >> Output.txt

(参考に、この内容は猫の無駄な使用)。ただし、ループ実装によって生成された順序を特別に一致させる必要がない限り、awkに2つのファイルを直接処理させることで、シェルループ全体をスキップするのが最善です。

awk 'NR==FNR{a[$0]; next} $4 in a' NamesList.txt BigFile.txt > Output.txt

(私はあなたが>>シェルループのためにそれを使用していると仮定しています)。

おすすめ記事