dir의 모든 파일을 다른 파일과 비교하고 공통 줄의 출력을 인쇄하는 방법

dir의 모든 파일을 다른 파일과 비교하고 공통 줄의 출력을 인쇄하는 방법

먼저 100개의 .txt 파일로 구성된 dir/이 있습니다.

john_1.txt, john_2.txtjohn_3.txt, john_4.txtex. 그런 다음 이메일 주소가 한 줄씩 나열된 id;email;name;phone 다른 파일이 있습니다 .emails.txt

모든 파일을 이 이메일 파일과 비교하고 공통 행을 인쇄하려면 어떻게 해야 합니까?

grep또는 diff?

답변1

을 사용하면 awk다음과 같습니다.

awk -F\; 'NR == FNR {A[$0]=1; next}; A[$2] == 1;' emails.txt john*.txt

NR == FNR이것이 첫 번째 파일인지 테스트하는 흥미로운 방법은 모든 파일에서 계산되는 레코드(줄) 번호가 현재 파일의 레코드 번호와 동일한지 테스트하는 것입니다. 그렇다면 전체 행 read( $0)를 가져와서 이라는 연관 배열에 대한 키로 사용하고 A값을 1로 설정한 다음 next입력 행으로 점프합니다. 첫 번째 파일이 아닌 경우(점프가 이루어지지 않음) $2세미콜론으로 구분된 줄의 두 번째 필드( )를 가져와( 로 설정 -F) 배열의 해당 값이 A1인지 확인합니다. 그렇다면 기본 작업은 전체 줄을 인쇄하는 것입니다. 예를 들어 {print $1}첫 번째 필드만 인쇄되도록 추가할 수 있습니다.


너와 grep함께라면 할 수 있어

grep -F -f emails.txt john*.txt

( -F고정 문자열 패턴의 경우 -f파일에서 패턴을 읽습니다.) 그러나 이는 파일의 다른 필드에 대한 일치뿐만 아니라 부분 일치도 인쇄하지만 이름, 전화번호 및 이메일 주소에는 문제가 되지 않을 수 있습니다.

하지만 패턴으로 사용되는 각 줄의 시작과 끝 부분에 세미콜론을 추가하면 이 문제를 해결할 수 있습니다. 프로세스 대체가 지원되면 다음과 같이 작동합니다.

grep -F -f <(sed -e 's/^/;/' -e 's/$/;/' emails.txt) john*.txt 

관련 정보