2

我通常使用原始或 csv 文件,这些文件具有可以在各种数学程序中使用的唯一标识符。最近,我收到了一个文件文件夹,其中将记录相互匹配的唯一方法是通过它们在文本文件中的位置。

这是一个示例 File01.txt:

AA1000   
AA2222        
AB1X6110305126101234760ABA08B88                   ZZ1111110000  
AB2X611030512612006100901C109Z 001110001110                                    
AB2X611030512612006100901X571Z 007410000000                                                                   
AB1X6110305127101234760ABA10B89                   ZZ1111110022  
AB2X611030512712006101001A571Z 007410000000                                  
AB1X6110305128101234760ABA10C00                   ZZ1111110055  
AB2X611030512812006101001A571Z 007410007410                                    
AC11

第 3 行以 AB1 开头,第 4-8 行以 AB2 开头,对应于第 3 行,如从该行第 4 位开始的 12 个字符串所示。该 12 个字符的字符串是匹配集群的唯一方法,但它不一定在所有行中都是唯一的。要知道 4-8 中的 AB2 组对应于第 3 行中的 AB1 组的唯一方法是第 4-8 行跟随第 3 行。对于像我这样的非程序员来说,这是一场噩梦。

我想做的是在 File01.txt 中读取并逐行循环,直到遇到 AB1 行。我想存储 AB1 线,然后继续循环。一条 AB1 线后面总是至少有一条 AB2 线。我想将 AB2 行写入数组并从内存中追加 AB1 行,然后继续循环并写入数组,直到遇到新的 AB1 行。新的 AB1 行现在将存储在内存中,并按照上述方式执行直到下一个 AB1 行,依此类推,直到到达文件末尾(通常是 AC11 行)

我希望输出文件看起来像这样:

AB2X611030512612006100901C109Z 001110001110    AB1X6110305126101234760ABA08B88                   ZZ1111110000                            
AB2X611030512612006100901X571Z 007410000000    AB1X6110305126101234760ABA08B88                   ZZ1111110000                                                         
AB2X611030512712006101001A571Z 007410000000    AB1X6110305127101234760ABA10B89                   ZZ1111110022                                 
AB2X611030512812006101001A571Z 007410007410    AB1X6110305128101234760ABA10C00                   ZZ1111110055    

虽然不理想,但我可以使用这种类型的数据并拆分字符串等。这可能使用 bash 和 awk 或 sed 之类的东西吗?

提前感谢您提供的任何帮助/见解。

4

2 回答 2

4

如果我有你的要求,这个小 awk 程序将起作用:

awk '/^AB1/{ab1=$0;next}/^AB2/{print $0, ab1}'

这对不以 AB1 或 AB2 开头的任何行都不起作用,并且无法检查 AB1/AB2 后面的 12 个字符的字符串是否相等。我不知道你是否需要那张支票。

于 2013-07-29T02:43:27.630 回答
2

这可能对您有用(GNU sed):

sed -r '/^AB1/!d;$!N;/\nAB2/!D;s/\s+$/ /;s/(.*)\n(.*)/\2\1\n\1/;P;D' file

提供的示例中的间距似乎有点不切实际,因此我将其缩小为一个空格。

于 2013-07-29T07:56:22.313 回答