Sie könnten es mit sed tun, aber andere Werkzeuge sind einfacher. Beispielsweise:
$ awk '{
printf "%s ", $2;
for(i=3;i<=NF;i++){
printf "%s:%s:1 ",$1,$(i)
}
print ""
}' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Erläuterung
awk wird jede Zeile von Eingang auf Leerzeichen geteilt (Standardeinstellung), von denen jede Feldern wie Speicher $1
, $2
, $N
. So:
printf "%s ", $2;
druckt das 2. Feld und ein Leerzeichen nach.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: durchläuft die Felder 3 bis zum letzten Feld (entspricht NF
der Anzahl der Felder) und druckt für jedes Feld das erste Feld, ein :
, dann das aktuelle Feld und ein :1
.
print ""
: dies gibt nur eine letzte neue Zeile aus.
Oder Perl:
$ perl -ane 'print "$F[1] "; print "$F[0]:$_:1 " for @F[2..$#F]; print "\n"' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Erläuterung
Die -a
Marken perl
verhalten sich wie awk
und teilen ihre Eingabe in Leerzeichen auf. Hier werden die Felder im Array gespeichert @F
, dh das 1. Feld $F[0]
ist das 2. $F[1]
usw. Also:
print "$F[1] "
: druckt das 2. Feld aus.
print "$F[0]:$_:1 " for @F[2..$#F];
: Iteriere über die Felder 3 bis zum letzten Feld ( $#F
ist die Anzahl der Elemente im Array @F
, also @F[2..$#F]
nimmt ein Array Slice ab dem 3. Element bis zum Ende des Arrays) und drucke das 1. Feld, a :
, dann das aktuelle Feld und a :1
.
print "\n"
: dies gibt nur eine letzte neue Zeile aus.
Mit awk:
oder mit bash:
Ausgabe:
quelle
Nun, Sie können es in sed tun, aber Python funktioniert auch.
Inhalte der
reformatfile.py
sind wie folgt:Wie funktioniert das? Es ist wirklich nichts Besonderes los. Wir öffnen das erste Befehlszeilenargument als Datei zum Lesen und teilen jede Zeile in "Wörter" oder einzelne Elemente auf. Erste Worte werden
pref
variabel, und wir drucken auf das zweite (words [1]) -Element, das mit einem Leerzeichen endet. Als nächstes konstruieren wir eine neue Menge von "Wörtern" über Listenverständnisse und.join()
funktionieren auf einer temporären Liste von Präferenzen, jedem Wort und jeder Zeichenkette"1"
. Der letzte Schritt besteht darin, diese auszudruckenquelle
Mit
awk
:Es geht darum, durch Leerzeichen getrennte Felder im gewünschten Format zu formatieren:
printf("%s ", $2)
druckt das zweite Feld mit einem Leerzeichen nachfor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)
Iteriert über das drittletzte bis vorletzte Feld und druckt die Felder im gewünschten Format (erstes Feld, dann ein Doppelpunkt, dann das aktuelle Feld, dann ein Doppelpunkt, schließlich 1) mit einem Leerzeichen nachprintf("%s:%s:1\n", $1, $NF)
druckt das letzte Feld mit ZeilenumbruchBeispiel:
quelle