두 개의 큰 파일이 있습니다.
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
후행 문자를 제거한 다음 (다른 하위 프로세스를 호출하지 않고 이 작업을 수행할 수 있는 더 우아한 방법이 있을 것이라고 확신합니다), 이를 = |
에 대한 인수로 사용합니다 .egrep
grep -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.txt
a
next
그런 다음 다음 파일에 도달했을 때 두 번째 필드가 배열에 있으면 주장( $2 in a)
은 true가 되고 awk
해당 줄을 인쇄합니다. 이는 주장이 true로 평가될 때의 기본 작업입니다. 이는 다음의 단축 버전일 뿐입니다.
awk -F'[ |]+' '{
if(NR==FNR){
a[$1]++;
}
else if($2 in a ){
print
}
}' f2.txt f1.txt