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,
Quero obter todas as strings existentes na primeira linha (começando com string entre ", and=" ) e não existentes na última linha e anexá-las ao final da última linha.
Responder1
Forme um hash %h
cujas chaves sejam strings entre ,
e =
. Isto é formado apenas para a primeira linha. Depois, na segunda linha, procuramos se essas chaves estão presentes na 2ª linha e coletamos aquelas que não foram encontradas e join
juntas 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
Responder2
Eu dividiria o arquivo em dois, cada um contendo uma das linhas. Eu então dividiria as linhas na vírgula. Em seguida, execute uma comparação e copie os resultados, junte-os novamente em uma linha,e viola.
Esse é o caminho mais longo. Tenho certeza que você poderia escrever algum tipo de awk
roteiro ou algo para fazer isso de uma só vez.