awk はファイルから文字列を検索します。

awk はファイルから文字列を検索します。

私は現在使用しています

 $ awk 'NR==FNR{a[$1];next} ($3 in a)' find.txt path_to_100_files/*

find.txt 文字列を使用して、path_to_100_files/ にある複数のファイルから一致する項目を検索します。

find.txt には以下が含まれます。

[email protected]
[email protected]

その後、path_to_100_files/にはファイルが含まれます。

0.0.0.0:002921931:[email protected]
123.0.0.1:00029382:[email protected]

今はfind.txtの文字列の3番目の列を検索するだけです。しかし、ファイル全体/各列を検索するにはこの検索が必要ですか?

一部のファイルの長さは5列または9列です。例えば、

0.0.0.0:002921931:1111111:[email protected]
123.0.0.1:00029382:1111111:11111:[email protected]

($ 3 in a)を($ 0〜$ 9 in a)に変更しようとしましたが、うまくいかないと思いますか?

答え1

なぜフィールドを1つずつ検索するのですか?一度に行全体を検索するとどうなりますか?

grep -f find.txt path_to_100_files/*

答え2

電子メールが100ファイルの最後のフィールドである場合は、次を使用してください。

awk -F: 'NR==FNR{a[$1];next} ($NF in a)' find.txt path_to_100_files/*

各フィールドを調べる必要がある場合は、ループが必要です。

awk -F: 'NR==FNR{a[$1];next} {for (i=1;i<=NF;i++) {if ($i in a) {print;break}}} find.txt path_to_100_files/*

しかし、より簡単な呼び出しはgrepを使用することです。

grep -oFf find.txt path_to_100_files/*

答え3

まず、ファイル内の最大列を見つけて、次のコマンドを使用して最大値を取得します。

k=`awk -F ":" '{print NF}'  path_to_100_files/*  | sort -nr | head -1`

forループを使用して各列を確認してください。

for ((i=0;i<=$k;i++)); do awk -v i="$i" -F ":" 'NR==FNR {a[$1];next}($i in a) {print }’   find.txt path_to_100_files/*   ; done

関連情報