파일 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