繁体   English   中英

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

[英]Bash: loop through file line by line, find specific string and append to each subsequent line until same string is found

我通常使用具有唯一标识符的原始文件或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之类的东西或类似的东西可能吗?

在此先感谢您为我提供的任何帮助/见解。

如果我有您的要求,那么这个awk小程序将可以工作:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM