Ich habe eine Datei mit zwei Zeilen wie:
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,
Ich möchte alle Zeichenfolgen abrufen, die in der ersten Zeile vorhanden sind (beginnend mit einer Zeichenfolge zwischen ", und=") und in der letzten Zeile nicht vorhanden sind, und sie an das Ende der letzten Zeile anhängen.
Antwort1
Bilden Sie einen Hash %h
, dessen Schlüssel Zeichenfolgen zwischen ,
und sind =
. Dies wird nur für die erste Zeile gebildet. Dann suchen wir in der zweiten Zeile, ob diese Schlüssel in der 2. Zeile vorhanden sind, sammeln die nicht gefundenen und join
verknüpfen sie mit einem Komma.
perl -F, -lpe '
$. == 1 and %h = /,([^=]*)=([^,]*)/g, next;
$l = $_;
$_ .= join ",", grep $l !~ /,\Q$_=/, keys %h;
' your_2-line_file
Ergebnis
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
Antwort2
Ich würde die Datei in zwei Teile aufteilen, von denen jeder eine der Zeilen enthält. Ich würde die Zeilen dann am Komma aufteilen. Dann führe ich einen Diff-Befehl aus, kopiere die Ergebnisse und füge sie wieder zu einer Zeile zusammen.und violett.
Das ist der lange Weg. Ich bin sicher, Sie könnten eine Art awk
Skript oder etwas Ähnliches schreiben, um es auf einen Schlag zu erledigen.