번호가 매겨진 색인을 사용하여 파일 결합

번호가 매겨진 색인을 사용하여 파일 결합

나는이 명령을 시도하고 있습니다 :

join -a1 -11 file1 file2 > file3

파일 1은 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11

파일 2:

1    lkj    klj    lkj
2    lkj    lkj    lkj
3
7    lkj    lkj    lkj
8
9
11    lkk    kll    lkk

출력에서는 줄 번호 11을 건너뜁니다.

Google에서 검색했을 때 알파벳 순서만 이해한다는 것을 알았지 join만 이를 수행할 수 있는 방법이 있어야 합니다. 내 목표는 유전 프로젝트에 60,000,000개의 라인 파일 5개를 추가하는 것입니다.

어떻게 해야 하나요? join이를 작동시키는 다른 도구나 옵션이 있습니까 ?

답변1

귀하의 대용량 파일이 이미 정렬되어 있다고 가정합니다. 다음 방법에는 추가 정렬이 필요하지 않습니다.

다음을 사용하여 간단히 키 앞에 0을 추가할 수 있습니다 sed. 프로세스가 파이프라인이므로 처리할 임시 파일이 없습니다. 오버헤드 sed는 무시할 수 있습니다.


# make key 9 digits    # Add 9 leading 0's       # Remove excess 0's  
join -a1 -11 <(sed -r 's/^([0-9]+)/000000000\1/; s/^0+([0-9]{9})/\1/' file1) \
             <(sed -r 's/^([0-9]+)/000000000\1/; s/^0+([0-9]{9})/\1/' file2)

출력은 다음과 같습니다

000000001 lkj klj lkj
000000002 lkj lkj lkj
000000003
000000004
000000005
000000006
000000007 lkj lkj lkj
000000008
000000009
000000010
000000011 lkk kll lkk

출력에 0을 표시하지 않으려면 대신 이 명령을 사용하십시오. 선행 0이
추가로 sed -r 's/^0+//'제거됩니다.

join -a1 -11 <(sed -r 's/^([0-9]+)/000000000\1/;s/^0+([0-9]{9})/\1/' file1) \
             <(sed -r 's/^([0-9]+)/000000000\1/;s/^0+([0-9]{9})/\1/' file2) |
               sed -r 's/^0+//'   

산출

1 lkj klj lkj
2 lkj lkj lkj
3
4
5
6
7 lkj lkj lkj
8
9
10
11 lkk kll lkk

답변2

입력 파일을 정렬하고 출력을 숫자순으로 정렬할 수 있습니다.

join -a1 -11 <(sort -k1,1 file1) <(sort -k1,1 file2) | sort -k1,1n

관련 정보