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