Erstellen einer neuen Liste aus einer vorhandenen Liste basierend auf der ersten Spalte

Erstellen einer neuen Liste aus einer vorhandenen Liste basierend auf der ersten Spalte

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 OFSVariable, die wir in der Befehlszeile festlegen, -vist die Ausgabetrennzeichenfolge, die zum Abgrenzen der Ausgabefelder verwendet wird, und NFist 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 :lund tljedem Besucher in der aktuellen Eingabezeile den Gruppennamen voranzustellen.

verwandte Informationen