最初の列を維持しながら行を複数の行に分割

最初の列を維持しながら行を複数の行に分割

テキストファイルを再フォーマットする方法はありますか?

'n      n / [ ] / m / N        
'ns      @ s / @ z / @ / j @ z / j @ s        
'r      r        
's      s / z / [ ]    
...

到着

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

つまり、/行でsに会うと、行は/最初の列を維持しながらsの位置を基準に分割します(最初の列の後には常に6つのスペースがあります)。

tr / '\n' < filename1 > filename2線を区別しようとしました。

'n      n 
 [ ] 
 m 
 N        
 'ns      @ s 
 @ z 
 @ 
 j @ z 
 j @ s        
 'r      r        
 's      s 
 z 
 [ ]  
...

ただし、連続した行の最初の列を維持することはできません。

ベストアンサー1

すべてのUnixシステムのすべてのシェルでawk:

これが最初のフィールドと行の残りの部分の間にあるタブの場合:

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

または一連の空白文字の場合:

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

または、前に固定された8文字の幅フィールドの場合は、次のいずれかを実行できます。

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

または:

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

おすすめ記事