grep 来自多个文件的多个模式并打印第一个匹配项

grep 来自多个文件的多个模式并打印第一个匹配项

我有两个文件,我想从多个文件 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

相关内容