unir arquivos com índice numerado

3

Estou tentando este comando:

join -a1 -11 file1 file2 > file3

file1 se parece com:

1
2
3
4
5
6
7
8
9
10
11

arquivo2:

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

A saída pula a linha numerada 11.

Enquanto pesquisava, vi que join apenas entendia a classificação alfabética, mas deve haver uma maneira de fazer isso. Meu objetivo é juntar cinco arquivos de 60.000.000 linhas para um projeto genético.

Como posso fazer isso? Existem outras ferramentas ou opções para join para que funcione?

    
por awe1 14.11.2011 / 13:04

2 respostas

3

Eu suponho que seus arquivos grandes já estão classificados. O método a seguir não requer mais classificação.

Você pode simplesmente adicionar zeros à esquerda para as chaves, usando sed ... Como o processo é pipeline, não há arquivos temporários para lidar. A sobrecarga de sed é trivial.

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

A saída é:

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

Se você não quiser os zeros à esquerda na saída, use este comando no lugar. O extra sed -r 's/^0+//' remove zeros à esquerda.

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

Saída

1 lkj klj lkj
2 lkj lkj lkj
3
4
5
6
7 lkj lkj lkj
8
9
10
11 lkk kll lkk
    
por 14.11.2011 / 13:57
1

Você pode classificar os arquivos de entrada, o tipo numericamente a saída:

join -a1 -11 <(sort -k1,1 file1) <(sort -k1,1 file2) | sort -k1,1n
    
por 14.11.2011 / 13:58