まず、100 個の .txt ファイルで構成される dir/ があります。
john_1.txt
、john_2.txt
等john_3.txt
、john_4.txt
ex。その後、電子メールアドレスが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
)、配列の対応する値がA
1であることを確認します。もしそうなら、基本的な仕事は行全体を印刷することです。たとえば、{print $1}
最初のフィールドのみを印刷するように追加できます。
君grep
と一緒ならできます
grep -F -f emails.txt john*.txt
(-F
固定文字列パターンの場合は-f
ファイルからパターンを読み取ります。)ただし、ファイル内の他のフィールドの一致だけでなく部分一致も印刷しますが、名前、電話番号、電子メールアドレスに問題はない可能性があります。
ただし、パターンとして使用される各行の先頭と末尾にセミコロンを追加すると、この問題を解決できます。プロセス置換がサポートされている場合は、次のように動作します。
grep -F -f <(sed -e 's/^/;/' -e 's/$/;/' emails.txt) john*.txt