我通常使用原始文件或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之类的方法?
预先感谢你对我的帮助/洞察力。
发布于 2013-07-29 02:43:27
如果我有你的要求,这个小小的awk程序会起作用的:
awk '/^AB1/{ab1=$0;next}/^AB2/{print $0, ab1}'
这对不以AB1或AB2开头的任何行都不会起任何作用,而且它无法检查AB1/AB2后面的12个字符字符串是否相等。我不知道你是否需要那张支票。
发布于 2013-07-29 07:56:22
这可能对您有用(GNU sed):
sed -r '/^AB1/!d;$!N;/\nAB2/!D;s/\s+$/ /;s/(.*)\n(.*)/\2\1\n\1/;P;D' file
所提供的示例中的间距似乎有点不合理,因此我将其缩小为单个空间。
https://stackoverflow.com/questions/17915200
复制相似问题