複数のファイルから複数のパターンをgrepし、最初の一致を印刷します。

複数のファイルから複数のパターンをgrepし、最初の一致を印刷します。

2つのファイルがあり、複数のファイルfileB fileC fileDからfileA(電話番号リスト)の内容を1つずつgrepし、各数字の最初の項目を印刷したいと思います。最初のクリック後に各電話番号を印刷し、最後の電話番号まで次の電話番号をgrepしたいと思います。その番号がファイルBにすでに存在する場合は、CとDをgrepする必要はなく、次の番号に移動するだけです。助けてください

私はこれを以前に使用したことがあります。
zgrep -f number_list.csv voice*20170301*gz | awk -F "|" '{print $22}' >> register_20170301.csv
zgrep -f number_list.csv sms*20170301*gz | awk -F "|" '{print $22}' >> register_20170301.csv
zgrep -f number_list.csv data*20170301*gz | awk -F "|" '{print $22}' >> register_20170301.csv

答え1

while read phone_number
do
    for file in data*20170301*gz
    do 
        zgrep -q "${phone_number}" "${file}"
        if [ "$?" -eq "0" ]
        then
             zgrep -q "${phone_number}" ${file} >> register_20170301.csv
             break;
        fi
    done
done < number_list.csv

答え2

grepの場合、-mスイッチを使用すると、X行以降のファイルの読み取りを停止できます。たとえば、grep -m 2は、一致する2つのエントリを見つけた後に停止します。あなたの場合、最初の一致の後に停止するにはgrep -m 1を使用してください。一致するものを探す grep コマンドは成功した終了コードを返しますが、一致するものが見つからない grep コマンドはゼロ以外の値を返します。最初の grep が結果を正常に返したら、if/then/elif/fi または [[ test ]] ブロックを使用して後続の grep コマンドが実行されないようにすることができます。

TEMP=`zgrep -m 1 -f number_list.csv voice*20170301*gz`
[[ "$TEMP" ]] || TEMP=`zgrep -m 1 -f number_list.csv sms*20170301*gz`
[[ "$TEMP" ]] || TEMP=`zgrep -m 1 -f number_list.csv data*20170301*gz`
echo "$TEMP" | awk -F "|" '{print $22}' >> register_20170301.csv

答え3

ファイルが大きすぎない場合:

zgrep -f number_list.csv {voice,sms,data}*20170301*gz  | 
   awk -F'|' '{print $22}' | sort -u

関連情報