첫 번째 파일의 두 번째 열을 두 번째 파일의 첫 번째 열과 비교하여 첫 번째 파일의 일치하는 레코드를 인쇄합니다.

첫 번째 파일의 두 번째 열을 두 번째 파일의 첫 번째 열과 비교하여 첫 번째 파일의 일치하는 레코드를 인쇄합니다.

두 개의 큰 파일이 있습니다.

f1.txt:

5020118359      |13ZJ24001218                  |20141224|R
5020120475      |13ZJ38000813                  |20141204|R
5020127431      |13ZJ38001569                  |20141201|R
5020127689      |12ZJ44000606                  |20141203|R
5020127728      |13ZJ38001356                  |20141203|R
5020127956      |13ZJ62002544                  |20141205|R
5020127972      |13ZJ49000082                  |20141205|R
5020128325      |13ZJ57000785                  |20141210|R
5020128706      |13ZJ38002805                  |20141211|R
5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

f2.txt:

09Y903010552
12ZJ54000041
11XJ62118385
08Y909018946
09Y902011954
11XJ57120346
10XJ70107764
11XJ40165329
09XJ42008336
08Y912021435
11XJ51040272
07Y910027235

산출:

5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

첫 번째 파일의 두 번째 열을 두 번째 파일의 첫 번째 열과 비교한 다음 첫 번째 파일의 일치하는 레코드를 인쇄합니다.

답변1

시도해 보셨나요 awk? 이 작업은 에서 쉽게 수행할 수 있습니다 awk. 다음은 다른 솔루션입니다.

egrep $(tr '\n' '|' < f2.txt | sed 's/|$//') f1.txt

tr모든 개행 문자를 로 바꾸고 |, sed후행 문자를 제거한 다음 (다른 하위 프로세스를 호출하지 않고 이 작업을 수행할 수 있는 더 우아한 방법이 있을 것이라고 확신합니다), 이를 = |에 대한 인수로 사용합니다 .egrepgrep -e

답변2

표시된 간단한 예에서는 ( )를 검색할 패턴 목록으로 grep을 사용할 수 있습니다 .f2-f

$ grep -wf f2.txt f1.txt 
5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

make는 -w" grep전체 단어" 일치 항목만 찾으므로 foobar일치 항목으로 간주되지 않습니다 foo.

예를 들어 f2.txt여러 열이 있을 수 있거나 데이터가 f2.txt모든 열에 나타날 수 있지만 f1.txt열 1에만 표시하려는 더 복잡한 경우에는 다음을 사용할 수 있습니다 awk.

$ awk -F'[ |]+' 'NR==FNR{a[$1]++; next}($2 in a )' f2.txt f1.txt 
5020129084      |10XJ70107764                  |20141217|R
5020129102      |12ZJ54000041                  |20141217|R

-F필드 구분 기호를 하나 이상의 |공백 으로 설정합니다 . NR는 현재 줄 번호이고 FNR현재 파일의 줄 번호입니다. 여러 파일이 입력으로 제공되면 첫 번째 파일을 읽을 때만 두 파일이 동일합니다. 따라서 a[$1]++; next첫 번째 파일의 모든 줄에 대해 실행됩니다. 첫 번째 파일이 있으므로 f2.txt배열의 모든 첫 번째 필드가 저장됩니다. 다음 줄로 이동합니다.f2.txtanext

그런 다음 다음 파일에 도달했을 때 두 번째 필드가 배열에 있으면 주장( $2 in a)은 true가 되고 awk해당 줄을 인쇄합니다. 이는 주장이 true로 평가될 때의 기본 작업입니다. 이는 다음의 단축 버전일 뿐입니다.

awk -F'[ |]+' '{
                 if(NR==FNR){ 
                    a[$1]++; 
                 }
                 else if($2 in a ){
                    print
                 }
                }' f2.txt f1.txt 

관련 정보