在 Unix 中展平记录

Flattening records in Unix

如何通过组合 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|

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

感谢您的帮助。

这是一个识别和存储来自每对行的第一行的代码的问题,以便在每个输出行上继续使用从每对行的第二行解析的各个值。如果我们在开始时将字段分隔符设置为 *,将输出字段分隔符设置为 |,代码会更简洁。

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

/^IMP/  {   code =  }

/^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|

...根据需要。