compara duas linhas em um arquivo e modifica o último

0

Eu tenho um arquivo com duas linhas como:

XXXXXXX20170412,bu.1519=1,bu.1124=2,bu.1284=3,bu.1767=13,bu.1869=15,bu.1784=16,bu.1473=32,bu.1264=43,bu.1758=96,bu.1649=122,bu.1345=140,bu.1268=215,bu.1246=516,bu.1876=601,
XXXXXXX20170413,bu.1123=1,bu.1767=27,bu.1784=32,bu.1473=57,bu.1869=41,bu.1264=91,bu.1284=54,bu.1758=191,bu.1268=387,bu.1345=319,bu.1649=322,bu.1246=1199,bu.1876=1383,

Eu quero que todas as strings existam na primeira linha (começando com a string entre ", e=") e não existindo na última linha e anexando-as ao final da última linha.

    
por Charles nakhel 16.04.2017 / 07:02

2 respostas

0

Forma um hash %h cujas chaves são strings entre , e = . Isso é formado apenas para a primeira linha. Em seguida, na segunda linha, pesquisamos se essas chaves estão presentes na segunda linha e coletamos as que não foram encontradas e join -ed junto com uma vírgula.

perl -F, -lpe '
   $. == 1 and %h = /,([^=]*)=([^,]*)/g, next;
   $l = $_;
   $_ .= join ",", grep $l !~ /,\Q$_=/, keys %h;
' your_2-line_file

Resultado

XXXXXXX20170412,bu.1519=1,bu.1124=2,bu.1284=3,bu.1767=13,bu.1869=15,bu.1784=16,bu.1473=32,bu.1264=43,bu.1758=96,bu.1649=122,bu.1345=140,bu.1268=215,bu.1246=516,bu.1876=601,
XXXXXXX20170413,bu.1123=1,bu.1767=27,bu.1784=32,bu.1473=57,bu.1869=41,bu.1264=91,bu.1284=54,bu.1758=191,bu.1268=387,bu.1345=319,bu.1649=322,bu.1246=1199,bu.1876=1383,bu.1519,bu.1124
    
por 16.04.2017 / 11:45
0

Eu dividiria o arquivo em dois, cada um contendo uma das linhas. Eu então dividiria as linhas na vírgula. Em seguida, execute um diff e copie os resultados, junte-os a uma linha, et violà .

Esse é o caminho mais longo. Tenho certeza que você poderia escrever algum tipo de script awk ou algo assim para fazer isso de uma só vez.

    
por 16.04.2017 / 08:34