需要匹配一个字符串,然后打印下一个字符串匹配项并继续直到下一个字符串

需要匹配一个字符串,然后打印下一个字符串匹配项并继续直到下一个字符串

我在处理大型文本文件时遇到了麻烦,

我的示例 f1.txt 有 3000 多行,格式如下

我需要匹配一个字符串,然后将该字符串后面的行与另一个字符串(在本例中为“需要”)匹配,并将这些匹配的行与原始字符串一起打印。

这应该持续到所有字符串都结束。

示例要求如下,您能帮忙吗?

======f1.txt====

String      :  a

--
==

==


needed line ------------ 100

needed line -------------200


-





String      :  b


--
==

==


needed line ------------ 500

needed line -------------600

needed line ------------ 700

needed line -------------800

-


String      :  c

--

==


needed line ------------ 900



===
===

需要产出

a needed line ------------ 100

a needed line -------------200

b needed line ------------ 500

b needed line -------------600

b needed line ------------ 700

b needed line -------------800

c needed line -------------900

答案1

在 awk 中,

awk -F" : " '/^String/ {string = $2}; /^needed/ {print string, $0}' f1.txt

你可以在 sed 中做类似的事情,尽管它不是那么紧凑 - 基本上它使用 sed 的保持空间作为变量的等价物string。不幸的是,据我所知,在 sed 中没有简单的方法将保留空间添加到模式空间的前面,所以我们必须附加,然后交换顺序:

sed -rn -e '/^String : / {s///;h;}' -e '/^needed/ {G;s/(.*)\n(.*)/\2 \1/;p;}'  f1.txt

注意:完整的解决方案可能应该String在尝试打印之前检查是否已找到并分配 a(以防文件needed在任何之前包含行String)。

答案2

以下是执行此操作的示例脚本:http://paste.ubuntu.com/8186522/

我做了一些假设:

  1. 您的作业将使用 来作为分隔符。我在设置for:时利用了这一点。IFSread
  2. 您不介意多次查看文件。这可以一次性完成,事实上,这样做可能更容易,具体取决于实现方式。

相关内容