首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash:逐行遍历文件,找到特定的字符串并追加到后面的每一行,直到找到相同的字符串为止。

Bash:逐行遍历文件,找到特定的字符串并追加到后面的每一行,直到找到相同的字符串为止。
EN

Stack Overflow用户
提问于 2013-07-29 02:28:34
回答 2查看 1.5K关注 0票数 2

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

下面是一个例子File01.txt:

代码语言:javascript
运行
复制
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行)。

我希望输出文件的外观如下所示:

代码语言:javascript
运行
复制
AB2X611030512612006100901C109Z 001110001110    AB1X6110305126101234760ABA08B88                   ZZ1111110000                            
AB2X611030512612006100901X571Z 007410000000    AB1X6110305126101234760ABA08B88                   ZZ1111110000                                                         
AB2X611030512712006101001A571Z 007410000000    AB1X6110305127101234760ABA10B89                   ZZ1111110022                                 
AB2X611030512812006101001A571Z 007410007410    AB1X6110305128101234760ABA10C00                   ZZ1111110055    

虽然不太理想,但我可以处理这类数据并拆分字符串等。这是否可以使用bash、awk或sed之类的方法?

预先感谢你对我的帮助/洞察力。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-29 02:43:27

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

代码语言:javascript
运行
复制
awk '/^AB1/{ab1=$0;next}/^AB2/{print $0, ab1}'

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

票数 4
EN

Stack Overflow用户

发布于 2013-07-29 07:56:22

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

代码语言:javascript
运行
复制
sed -r '/^AB1/!d;$!N;/\nAB2/!D;s/\s+$/ /;s/(.*)\n(.*)/\2\1\n\1/;P;D' file

所提供的示例中的间距似乎有点不合理,因此我将其缩小为单个空间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17915200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档