먼저 100개의 .txt 파일로 구성된 dir/이 있습니다.
john_1.txt
, john_2.txt
등 john_3.txt
, john_4.txt
ex. 그런 다음 이메일 주소가 한 줄씩 나열된 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
) 배열의 해당 값이 A
1인지 확인합니다. 그렇다면 기본 작업은 전체 줄을 인쇄하는 것입니다. 예를 들어 {print $1}
첫 번째 필드만 인쇄되도록 추가할 수 있습니다.
너와 grep
함께라면 할 수 있어
grep -F -f emails.txt john*.txt
( -F
고정 문자열 패턴의 경우 -f
파일에서 패턴을 읽습니다.) 그러나 이는 파일의 다른 필드에 대한 일치뿐만 아니라 부분 일치도 인쇄하지만 이름, 전화번호 및 이메일 주소에는 문제가 되지 않을 수 있습니다.
하지만 패턴으로 사용되는 각 줄의 시작과 끝 부분에 세미콜론을 추가하면 이 문제를 해결할 수 있습니다. 프로세스 대체가 지원되면 다음과 같이 작동합니다.
grep -F -f <(sed -e 's/^/;/' -e 's/$/;/' emails.txt) john*.txt