Gibt es eine Möglichkeit, eine Textdatei neu zu formatieren von
'n n / [ ] / m / N
'ns @ s / @ z / @ / j @ z / j @ s
'r r
's s / z / [ ]
...
Zu
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
...
Das heißt, wenn wir /
in einer Zeile auf ein s stoßen, wird diese Zeile entsprechend der Position des /
s aufgeteilt, wobei die erste Spalte erhalten bleibt (nach der ersten Spalte sind immer 6 Leerzeichen).
Ich habe versucht tr / '\n' < filename1 > filename2
, die Zeilen so aufzuteilen,
'n n
[ ]
m
N
'ns @ s
@ z
@
j @ z
j @ s
'r r
's s
z
[ ]
...
aber ich konnte die erste Spalte nicht in den aufeinanderfolgenden Zeilen behalten.
Antwort1
awk in jeder Shell auf jeder Unix-Box:
Wenn es sich dabei um einen Tabulator zwischen dem ersten Feld und dem Rest der Zeile handelt:
$ awk 'BEGIN{FS=OFS="\t"} {n=split($2,f," */ *"); for (i=1; i<=n; i++) print $1, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
oder wenn es eine Reihe von Leerzeichen ist:
$ awk 'match($0,/[^ ]+ +/){key=substr($0,1,RLENGTH); n=split(substr($0,1+RLENGTH),f," */ *"); for (i=1; i<=n; i++) print key, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
oder wenn es sich vorne um ein Feld mit einer festen Breite von 8 Zeichen handelt, können Sie Folgendes tun:
$ awk '{key=substr($0,1,8); n=split(substr($0,9),f," */ *"); for (i=1; i<=n; i++) print key, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
oder:
$ awk '{n=split(substr($0,9),f," */ *"); for (i=1; i<=n; i++) printf "%-8s%s\n", $1, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
Antwort2
sed "s/ /\//" filename| awk -F "/" '{for(i=2;i<=NF;i++)print $1,$i}'
Ausgabe
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]