有沒有辦法重新格式化文字文件
'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 機器上的任何 shell 中的 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 [ ]
答案2
sed "s/ /\//" filename| awk -F "/" '{for(i=2;i<=NF;i++)print $1,$i}'
輸出
'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 [ ]