Bash:逐行循环遍历文件,找到特定的字符串并附加到每个后续行,直到找到相同的字符串

时间:2013-07-29 02:28:34

标签: regex bash sed awk grep

我通常使用具有唯一标识符的raw或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这样的东西吗?

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

2 个答案:

答案 0 :(得分:4)

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

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

对于任何不以AB1或AB2开头的行都无法执行任何操作,并且无法检查AB1 / AB2之后的12个字符的字符串是否相等。我不知道你是否需要检查。

答案 1 :(得分:2)

这可能适合你(GNU sed):

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

提供的示例中的间距似乎有点不切实际,所以我把它缩小到一个空格。