我通常使用具有唯一标识符的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这样的东西吗?
提前感谢您提供给我的任何帮助/见解。
答案 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
提供的示例中的间距似乎有点不切实际,所以我把它缩小到一个空格。