
Ich habe eine Liste im folgenden Format:
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
Aus der obigen Liste muss ich folgendermaßen eine Liste erstellen:
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
Antwort1
Das istsehrähnlich zuVerwenden von AWK für ein Arrayund ein paar andere Fragen. Die Grundidee besteht darin, jedes Feld ab Feld zwei in einer separaten Zeile auszudrucken, der das erste Feld vorangestellt ist.
In diesem Fall geben wir an, dass der Feldtrenner entweder ,
oder ist ;
, und stellen außerdem sicher, dass keine leeren Felder gedruckt werden (am Ende der ersten Zeile der angegebenen Daten befindet sich ein leeres Feld). Die OFS
Variable, die wir in der Befehlszeile festlegen, -v
ist die Ausgabetrennzeichenfolge, die zum Abgrenzen der Ausgabefelder verwendet wird, und NF
ist die Anzahl der Felder in der Zeile.
awk -F '[,;]' -v OFS=',' '{ for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
Angesichts der Daten in der Frage ergibt dies
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
Antwort2
Dies kann mit GNU sed wie folgt erfolgen:
sed -r 's:,$::;y:;,:,;:;:l;s:^(([^,]+)[^;]+);:\1\n\2,:;tl' file
Ich lösche bei jeder Eingabezeile das abschließende Komma, falls vorhanden, und ersetze dann Kommas durch Semikolons, um das Drucken zu erleichtern. Danach führe ich eine Such- und Ersetzungsschleife aus, um zwischen :l
und tl
jedem Besucher in der aktuellen Eingabezeile den Gruppennamen voranzustellen.