이것은 awk을 위해 설계된 것입니다.
$ awk -F'|' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file2 file1
abc|123|BNY|apple|
cab|234|cyx|orange|
설명
-F'|'
: 필드 구분 기호를로 설정합니다 |
.
NR==FNR
: NR은 현재 입력 행 번호이고 FNR은 현재 파일의 행 번호입니다. 두 번째 파일은 첫 번째 파일을 읽는 동안에 만 동일합니다.
c[$1$2]++; next
: 이것이 첫 번째 파일 인 경우 첫 번째 두 필드를 c
배열 에 저장하십시오 . 그런 다음 첫 번째 파일에만 적용되도록 다음 줄로 건너 뜁니다.
c[$1$2]>0
: else 블록은 이것이 두 번째 파일 인 경우에만 실행되므로이 파일의 필드 1과 2가 이미 표시되어 c[$1$2]>0
있는지 ( ) 확인한 다음 해당 필드가 있으면 행을 인쇄합니다. 에서 awk
, 기본 동작은 경우 있도록 라인을 인쇄하는 것입니다 c[$1$2]>0
사실, 라인이 인쇄됩니다.
또는 Perl 태그로 설정 했으므로 :
perl -e 'open(A, "file2"); while(<A>){/.+?\|[^|]+/ && $k{$&}++};
while(<>){/.+?\|[^|]+/ && do{print if defined($k{$&})}}' file1
설명
첫 번째 줄이 열리고 file2
두 번째 |
( .+?\|[^|]+
) 까지 모든 것을 읽고 해시에 저장합니다 ( $&
마지막 일치 연산자의 결과 임) %k
.
두 번째 줄은 file1을 처리하고 동일한 정규식을 사용하여 첫 번째 두 열을 추출하고 해당 열이 %k
해시에 정의되어 있으면 해당 줄을 인쇄합니다 .
위의 두 가지 접근 방식은 모두 file2의 두 번째 열을 메모리에 보관해야합니다. 수십만 줄만 있으면 문제가되지 않지만 그럴 경우 다음과 같은 작업을 수행 할 수 있습니다
cut -d'|' -f 1,2 file2 | while read pat; do grep "^$pat" file1; done
그러나 그것은 느려질 것입니다.