![](/img/trans.png)
[英]How can I search a file for a specific string until a blank line and paste that into the first line of a different file?
[英]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.