Text transponieren mit sed

356
jamsheer np

Bitte helfen Sie mir herauszufinden, wie ich das Problem lösen kann sed.

Gegeben der folgende Text:

Kerala 4222 8129 8163 8164   Delhi  8502 8503 8504 8505  Goa 1 39 45 

Ich möchte es in folgendes Format konvertieren:

Kerala 4222 Kerala, 8129 Kerala, 8163 Delhi 8502 Delhi, 8503 Delhi 8504 Delhi 8505 Goa, 1 Goa, 39 Goa, 45 
-3
Muss es "sed" sein und nicht "awk" (oder "perl", "Python" usw.)? RedGrittyBrick vor 8 Jahren 0
Willkommen bei Superuser! Sie sollten wissen, dass bei den Fragen im Allgemeinen erwartet wird, dass sich die Forschungsarbeit hier zeigt. Aus diesem Grund werden sie zur Zeit heruntergestuft. SU ist kein Skriptschreibservice. Wenn Sie einige Schritte zeigen, die Sie unternommen haben, können wir Ihnen beim Durchlaufen dieser Schritte helfen. Lesen Sie unbedingt die [Hilfe] (http://superuser.com/help/asking), um ein Gefühl dafür zu bekommen, was hier erwartet wird. Mikey T.K. vor 8 Jahren 0

1 Antwort auf die Frage

0
kristian

Nehmen wir an, Ihre Datei hat den Namen test1

Der ganze Befehl sieht dann so aus (in einer Zeile):

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") && names2=($) && for var in "$"; do numbers=$(cat test1 | sed -n "/$var/" | sed "s/\s/;/g"); numbers2=($); for num in "$"; do echo "$var,$num"; done; done 

Sehen Sie sich dieses Skript zur besseren Übersicht an:

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")  names2=($) for var in "$"; do  numbers=$(cat test1 | sed -n "/$var/" | sed "s/\s/;/g") numbers2=($) for num in "$"; do  echo "$var,$num" done done 

Nun möchte ich alle Teile des Befehls beschreiben

BESCHREIBUNG DES BEFEHLS

Der Befehl names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")gibt mir eine Liste der Namen, die in Ihrem Fall durch ein Semikolon getrennt sind Kerala;Delhi;Goa. Ich möchte sie in dieser Form haben, da ich sie jetzt mit dem zweiten Befehl in ein Array umwandeln kann names2=($). Jetzt durchlaufe ich alle Namen, was mit der ersten forSchleife erledigt wird.

Der Befehl numbers=$(cat test1 | sed -n "/$var/" |sed "s/\s/;/g");gibt mir die Nummern für die aktuelle Variable $var. Dh Keraladafür wäre es 4222;8129;8163;8164. Das Verhalten ist dasselbe wie beim ersten Befehl: Ich möchte sie in ein Array umwandeln, damit ich sie durchlaufen kann, was mit dem nächsten Befehl erledigt wird numbers2=($);. Jetzt durchlaufe ich die Zahlen und drucke sie auf den Bildschirm

for num in "$"; do echo "$var,$num"; done 

Ich hoffe das ist verständlich.

Es funktioniert ... Vielen Dank für Ihre rechtzeitige Antwort ... jamsheer np vor 8 Jahren 0