我有两个文件,我想从多个文件 fileB fileC fileD 中逐一 grep fileA(电话号码列表)的内容,并打印每个号码的第一个匹配项。我想在第一次点击后打印每个电话号码,并 grep 下一个直到最后一个电话号码。请注意,如果数字已在文件 B 中找到,则无需 grep C 和 D,只需移至下一个数字。请帮忙
我之前用过这个
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