Lendo valores de um arquivo e imprimindo as linhas presentes em outro arquivo

2

Eu tenho dois arquivos diferentes: arquivo1 com 1 milhão de entradas e arquivo 2 com 1,3 milhões de entradas. Meu arquivo 1 se parece com isso

A  54 54 67 abcd
C 54 4 1.2 lmno
D 43 2 22.2 asdasd

O File2 tem a mesma aparência

A 0 1.1 1 qr
D 2 1 1 rerlm

No entanto file1 tem mais entradas que file2. Nem todos os valores da coluna 1 estão presentes no arquivo2. Todas as outras colunas são diferentes.

Eu preciso imprimir todas as linhas file1 que correspondam à primeira coluna no arquivo2. Em poucas palavras, imprima todas as linhas no arquivo1 e armazene-o no arquivo3 com base na presença ou não da primeira entrada da coluna no arquivo2.

    
por identical123456 26.07.2018 / 04:18

1 resposta

0

Uma solução simples é usar o comando join para realizar isso.

Isso requer que os dois arquivos sejam classificados , pois join só funciona nesses casos ... Você pode usar sort para ordenar os ficheiros, se não estiverem ordenados.

Ele também assume que o número de campos no primeiro arquivo (aquele que você deseja imprimir) é fixo, já que você precisa especificar os campos de saída um por um.

Esta solução também pressupõe que você está OK com a alteração do espaço em branco entre os campos da solução. E que você está OK com o resultado final sendo classificado (e não necessariamente preservando a ordem do arquivo1), se o arquivo1 não foi classificado para começar com ...

Então, supondo que você esteja bem com essas restrições, tudo que você precisa fazer é:

$ join -o 1.1,1.2,1.3,1.4,1.5 file1 file2
A 54 54 67 abcd
D 43 2 22.2 asdasd

Se os arquivos não estiverem classificados, uma abordagem simples é usar substituição do processo bash para ordená-los on-the-fly e alimentá-los para join :

$ join -o 1.1,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)

(Embora se os arquivos forem grandes e possuírem milhões de linhas, talvez você queira armazenar os resultados classificados, para não ter que classificar novamente.)

Uma pequena nota de que isso depende da sua localidade (que define a ordem de classificação), você também pode querer passar a opção sort the -b para pular espaços em branco se você tiver isso em seus arquivos ... de join também sugere usar sort -k 1b,1 e também discute o uso de LC_COLLATE para controlar a ordem na ordenação e participar ... Espero que seja um bom começo para resolver essa questão!

    
por 26.07.2018 / 05:48