Tengo un archivo con dos líneas 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,
Quiero que todas las cadenas existan en la primera línea (comenzando con la cadena entre ", y=") y que no existan en la última línea y agregarlas al final de la última línea.
Respuesta1
Forme un hash %h
cuyas claves sean cadenas entre ,
y =
. Esto se forma sólo para la primera línea. Luego, en la segunda línea, buscamos si estas claves están presentes en la segunda línea y recopilamos las que no se encuentran y join
las colocamos junto con una coma.
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
Respuesta2
Dividiría el archivo en dos, cada uno con una línea. Luego dividiría las líneas por la coma. Luego ejecute una diferencia y copie los resultados, únalos nuevamente en una línea,y viola.
Ese es el camino más largo. Estoy seguro de que podrías escribir algún tipo de awk
guión o algo para hacerlo de una sola vez.