파일이 2개 있는데,
head file1
1 115258827 12 HG00099
1 115258827 5 HG00100
1 115258827 8 HG00101
1 115258827 6 HG00103
1 115258827 4 HG00108
1 115258827 3 HG00110
1 115258827 4 HG00111
1 115258827 2 HG00114
1 115258827 8 HG00115
1 115258827 5 HG00116
그리고 또 다른 파일
head file2
HG00096 0|0
HG00097 0|0
HG00099 0|0
HG00100 0|1
HG00101 0|0
HG00102 0|0
HG00103 0|0
HG00105 0|0
HG00106 0|0
HG00107 0|0
file1의 마지막 열이 file2의 첫 번째 열과 일치하는지 확인하고, file2의 두 번째 열을 file1에 추가하고 다음과 같이 끝나기를 원합니다.
head desired
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0
답변1
데이터를 병합/결합하려는 필드가 정렬되어 있다고 가정합니다.
$ join -1 4 -o1.1,1.2,1.3,0,2.2 file1 file2
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0
그러면 네 번째 열( 파일의 첫 번째 열이 아니기 때문에 file1
지정됨 )과 첫 번째 열(파일을 정렬해야 하는 열) 의 두 파일이 결합됩니다 .-1 4
file2
이 -o
플래그는 join
출력에서 보고 싶은 필드와 해당 필드를 가져올 파일을 알려줍니다( 1.3
예: "첫 번째 파일의 세 번째 필드", 0
조인 필드를 의미).
사용의 장점 join
은 두 파일 모두 메모리로 완전히 읽을 필요가 없다는 것입니다.
파일이 정렬되지 않은 경우 다음 방법을 사용하여 파일을 한 번에 모두 사전 정렬할 수 있습니다.
sort -k4 -o file1 file1
sort -o file2 file2
또는 프로세스 대체를 이해하는 쉘을 사용하는 경우 다음을 사용하여 조인하는 동안 정렬할 수 있습니다.
join -1 4 -o1.1,1.2,1.3,0,2.2 <( sort -k4 file1 ) <( sort file2 )
정렬된 데이터는 join
한 번에 각 파일의 몇 행만 메모리에 저장할 수 있습니다.
답변2
노력하다:
awk 'FNR==NR{seen[$1]=$2; next} seen[$NF]{print $0, seen[$NF]}' file2 file1
$1 열의 키를 사용하여 $2 열의 해당 값을 다음과 같은 연관 배열에 저장합니다.본언제앗읽기 전용파일 2여기서 NR==FNR
(읽을 입력 파일이 여러 개인 경우 첫 번째 입력 파일에 대해 항상 true)는 NR
첫 번째 레코드/라인 읽기에서 1로 설정됩니다.앗단일 입력 파일 또는 여러 파일의 모든 레코드/라인을 읽을 때까지 증가하며 FNR
첫 번째 레코드/라인 읽기에서 1로 설정됩니다.앗현재 입력 파일에서 모든 레코드/라인을 읽을 때까지 증가하고 다음 파일에서 다시 1로 재설정됩니다.
마지막 열의 값이 표시된 배열의 동일한 키 값과 일치하면 다음 블록은 전체 줄을 인쇄합니다.파일 1그리고 배열에 있는 동일한 키의 값입니다.