Teilen Sie eine Zeile in mehrere Zeilen auf, wobei die erste Spalte erhalten bleibt.

Teilen Sie eine Zeile in mehrere Zeilen auf, wobei die erste Spalte erhalten bleibt.

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  [ ]   

verwandte Informationen