在Unix中展平记录

时间:2015-01-20 22:49:44

标签: unix awk normalization

如何通过组合2行并拆分另一行来压缩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|

输出中的第二个字段是序列号。有没有办法实现这个目标?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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|

......视需要而定。