불규칙한 수의 열과 열을 일치시켜 두 파일을 결합하는 방법은 무엇입니까?

불규칙한 수의 열과 열을 일치시켜 두 파일을 결합하는 방법은 무엇입니까?

파일 1:

0000002|SLM DEV CORP                                               |PO 857
0000003|S TOPPING                                                   |APT 19
0000004|JD  BROS LTD                                                |PO 118
0000005|ZKZ SERVICES                                                |14699  CREDITVIEW RD

파일 2:

0000001|GTI CONSULTING                     |4513 GLADEBROOK CRES    
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

예상 출력:

0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857
0000003|S TOPPING                           |APT 19
0000004|JD PLETT BROS LTD                   |PO BOX 118
0000005|ZKZ SERVICES |ZKZ                   |14699  CREDITVIEW RD

나는 Join 명령을 시도했습니다.

join -j1 1 -j2 1 -t'|' -o 1.1 2.2 2.3 file1 file2

파이프 구분 기호로 인해 잘못된 출력이 발생합니다. 또한 열 2에는 모든 기호를 사용할 수 있으므로 다른 기호를 구분 기호로 사용할 수 없습니다.

파일 2의 열 1을 일치시키고 열 2와 3을 수직으로 복사해야 합니다.

또한 file2에서 file1의 열 1 데이터를 반복하여 출력을 가져오려고 시도했지만 파일이 매우 크기 때문에 시간이 오래 걸립니다.

답변1

awk조인 필드가 고유한 경우 간단히 사용하세요 .

awk -F"|" 'a[$1]++' file1 file2
  • -F"|"파이프를 구분 기호로 설정
  • a[$1]++조건입니다. 조건이 true이면 해당 행이 인쇄됩니다. 첫 번째 필드가 $1여러 번 나타나면 조건이 true입니다.

조인 필드가 고유하지 않은 경우:

awk -F"|" 'a[$1]++&&FNR!=NR' file1 file2
  • FNR!=NR: 역시 참이어야 하는 조건입니다. 이는 file2처리된 두 번째 파일 에만 적용됩니다 . 두 파일의 첫 번째 필드가 고유하다는 것을 보장할 수 있으면 이 조건을 제거할 수 있습니다.

답변2

일방 통행:

awk -F"|" 'NR==FNR{a[$1];next}($1 in a)' file1 file2

이것은 첫 번째 파일을 읽고 모든 키를 배열에 저장합니다. 두 번째 파일을 처리할 때 배열에 키가 있는 줄만 인쇄합니다.

파일 크기가 크기 때문에 파일을 정렬된 순서로 정렬해야 하므로 결합은 선호되지 않습니다.

답변3

내가 아는 한, file2첫 번째 필드에 있는 모든 행만 필요합니다 file1. 그렇다면 grep검색 및 awk/를 사용하여 cut첫 번째 필드를 얻을 수 있습니다.

$ grep -f <(cut -d '|' -f 1 file1) file2
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

또는:

$ grep -f <(awk -F'|' '{print $1}' file1) file2
0000002|SLM DEVELOPMENT CORP | SLM         |PO BOX 857              
0000003|S TOPPING                          |APT 19                  
0000004|JD PLETT BROS LTD                  |PO BOX 118              
0000005|ZKZ SERVICES |ZKZ                  |14699  CREDITVIEW RD    

관련 정보