dirのすべてのファイルを他のファイルと比較し、共通行の出力を印刷する方法

dirのすべてのファイルを他のファイルと比較し、共通行の出力を印刷する方法

まず、100 個の .txt ファイルで構成される dir/ があります。

john_1.txtjohn_2.txtjohn_3.txtjohn_4.txtex。その後、電子メールアドレスが1行ずつリストされているid;email;name;phone 別のファイルがあります。emails.txt

すべてのファイルをこの電子メールファイルと比較して共通の行を印刷するにはどうすればよいですか?

grepまたはdiff

ベストアンサー1

を使用すると、awk次のようになります。

awk -F\; 'NR == FNR {A[$0]=1; next}; A[$2] == 1;' emails.txt john*.txt

NR == FNRこれが最初のファイルかどうかをテストする興味深い方法は、すべてのファイルで計算されたレコード(行)番号が現在のファイルのレコード番号と同じであることをテストすることです。その場合は、行全体 read( $0) を取得し、という連想配列のキーとして使用し、A値を 1 に設定してからnext入力行にジャンプします。最初のファイルでない場合(ジャンプが行われていない)、$2セミコロンで区切られた行の2番目のフィールド()を取得し、(に設定-F)、配列の対応する値がA1であることを確認します。もしそうなら、基本的な仕事は行全体を印刷することです。たとえば、{print $1}最初のフィールドのみを印刷するように追加できます。


grepと一緒ならできます

grep -F -f emails.txt john*.txt

-F固定文字列パターンの場合は-fファイルからパターンを読み取ります。)ただし、ファイル内の他のフィールドの一致だけでなく部分一致も印刷しますが、名前、電話番号、電子メールアドレスに問題はない可能性があります。

ただし、パターンとして使用される各行の先頭と末尾にセミコロンを追加すると、この問題を解決できます。プロセス置換がサポートされている場合は、次のように動作します。

grep -F -f <(sed -e 's/^/;/' -e 's/$/;/' emails.txt) john*.txt 

おすすめ記事