如何通过组合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|
输出中的第二个字段是序列号。有没有办法实现这个目标?
感谢您的帮助。
答案 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|
......视需要而定。