여러 파일에서 여러 패턴을 grep하고 첫 번째 일치 항목을 인쇄합니다.

여러 파일에서 여러 패턴을 grep하고 첫 번째 일치 항목을 인쇄합니다.

두 개의 파일이 있고 여러 파일 fileB fileC fileD에서 fileA(전화번호 목록)의 내용을 하나씩 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 명령은 0이 아닌 값을 반환합니다. 첫 번째 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

관련 정보