Une dois arquivos de texto na 1ª coluna mantendo a ordem e as linhas não parciais do 1º arquivo

3

Eu preciso mesclar dois arquivos que eu tenho, mas primeiro preciso combiná-los antes de mesclá-los. Este é o meu primeiro arquivo contendo digamos 1 milhão de linhas.

abcde
fghi
jklmn
opqrs
123456
0000

O segundo arquivo contém 3 milhões de linhas, mas algumas linhas têm a string que está no primeiro arquivo.

543123:fdfdss
dfskld:533fg
abcde:1234
fdskls:fkdfs
gfdkls:flfds
0000:5432
fdsk:saakl

Saída:

abcde:1234
fghi
jklmn
opqrs
123456
0000:5432

Eu quero que a saída seja file1: file2, mas apenas se corresponder à primeira coluna do arquivo2 com a string no file1. Eu não quero embaralhar o formato de classificação que eu quero que seja nesta ordem e eu quero manter as seqüências de arquivo1, mas basta adicionar as seqüências de caracteres correspondentes.

    
por alexanderjoe 19.09.2016 / 18:57

1 resposta

3

A maneira fácil é através de awk - basta ler o segundo arquivo, salvar cada linha em uma matriz (onde o índice é $ 1) e ao ler o primeiro arquivo verificar se a linha já é um índice na matriz - em caso afirmativo substituir com o valor desse elemento:

awk -F: 'NR==FNR{z[$1]=$0;next}
($0 in z) {$0=z[$1]};1' file2 file1

Você pode fazer isso com join também, mas isso requer mais trabalho (basicamente, numerar linhas no primeiro arquivo para poder classificar o resultado de join e restaurar a ordem):

join -a 1 -t: -1 2 -2 1 <(nl -s: -ba -nrz file1 | sort -t: -k2,2) \
<(sort -t: -k1,1 file2) | sort -t: -k2,2 | cut -d: -f1,3-
    
por 19.09.2016 / 21:11