2015-01-20 51 views
0

如何通過組合2行並拆分另一行來在UNIX中展平記錄。在Unix中展平記錄

文件中有一組記錄需要平鋪。

IMP*1000*000***12>D>1*N*A*Y*I~ 
HO*DK>4019*DF>25002~ 
IMP*1001*000***12>D>1*N*A*Y*I~ 
HO*DK>25000*DF>4139*DF>4019*DF>29631*DF>311*DF>4289*DF>42731~ 
IMP*1002*000***12>D>1*N*A*Y*I~ 
HO*DK>412*DF>4289*DF>2449*DF>4019~ 

輸出應該看起來像在輸出

1000|1|DK|4019| 
1000|2|DF|25002| 
1001|1|DK|25000| 
1001|2|DF|4139| 
1001|3|DF|4019| 
1001|4|DF|29631| 
1001|5|DF|311| 
1001|6|DF|4289| 
1001|7|DF|42731| 
1002|1|DK|412| 
1002|2|DF|4289| 
1002|3|DF|2449| 
1002|4|DF|4019| 

第二個字段是序列號。有沒有辦法做到這一點?

感謝您的幫助。

回答

2

這是一個識別和存儲來自每對輸出行上的第一行的代碼,並且從每對行的第二行解析出各個值。如果我們在開始時將字段分隔符設置爲*並將輸出字段分隔符設置爲|,則代碼更簡潔。

BEGIN { FS = "*"; OFS = "|" } 

/^IMP/ { code = $2 } 

/^HO/ { for (i = 2; i <= NF; i++) { 
       sub("~","",$i) 
       split($i,x,">") 
       print code,(i-1),x[1],x[2] "|" 
      } 
     } 

...其中,由於在問題所示的輸入,產生輸出:根據需要

11824393C1054263R0|1|DK|4019| 
11824393C1054263R0|2|DF|25002| 
11747326C1038424R0|1|DK|25000| 
11747326C1038424R0|2|DF|4139| 
11747326C1038424R0|3|DF|4019| 
11747326C1038424R0|4|DF|29631| 
11747326C1038424R0|5|DF|311| 
11747326C1038424R0|6|DF|4289| 
11747326C1038424R0|7|DF|42731| 
11972831C1024443R0|1|DK|412| 
11972831C1024443R0|2|DF|4289| 
11972831C1024443R0|3|DF|2449| 
11972831C1024443R0|4|DF|4019| 

...。

+0

非常感謝你 – 2015-01-21 16:41:01

+0

@ashokviswanathan:很高興幫助。如果您發現答案是令人滿意的,則可以將其檢查爲已接受,這樣可以避免其他人試圖找到針對同一問題的其他答案。 – Simon 2015-01-22 21:18:21