打印包含一组模式的段落(出现顺序无关紧要)
Print paragraphs that contain a set of patterns (order of occurrence doesn't matter)
给定一组模式 A = {a_1, a_2, ..., a_n}
,我想打印包含所有这些模式的段落:a_1
、a_2
、...、a_n
。
- 段落以非空白字符开始,以仅包含空白字符的行结束。
- 模式在段落中出现的顺序无关紧要。
假设我有以下文件
$ cat main.txt
a
b
c
a
b
b
c
c
a
a
b
c
我想打印所有包含以下模式的段落:\<a\>
、\<b\>
、\<c\>
。也就是说,输出应该是
$ {some command here}
a
b
c
我写了下面的命令。但是,这会将那些仅包含空格或制表符的行视为段落的一部分(回想一下,仅包含空格的行不能被视为段落的一部分)。我认为这可以通过执行 awk
一次来改善。
$ awk -v RS= '/\<a\>/ {print [=12=],"\n"}' main.txt |\
awk -v RS= '/\<b\>/ {print [=12=],"\n"}' |\
awk -v RS= '/\<c\>/ {print [=12=]}'
a
b
c
是否有更有效的方法来实现这一目标?
您必须为空 RS
:
准备输入
awk '!NF{[=10=]=""}1' main.txt > input.txt
这样,没有空白 (non-empty) 行将被视为段落的一部分,并且您消除了这些空白成为您的模式之一的可能性。实际上很难成为模式的一部分(但并非不可能),但是统一段落是很有可能的,所以这个输入"a\n \nb\n\c"
将被认为是一个匹配所有模式的段落。
当然,您必须 运行 awk
一次来测试每个段落的所有模式。但是,即使像现在这样一次一次,如果您准备好输入,它也会起作用。
awk -v RS= '/\<a\>/ && /\<b\>/ && /\<c\>/{print [=11=],"\n"}' input.txt
给定一组模式 A = {a_1, a_2, ..., a_n}
,我想打印包含所有这些模式的段落:a_1
、a_2
、...、a_n
。
- 段落以非空白字符开始,以仅包含空白字符的行结束。
- 模式在段落中出现的顺序无关紧要。
假设我有以下文件
$ cat main.txt
a
b
c
a
b
b
c
c
a
a
b
c
我想打印所有包含以下模式的段落:\<a\>
、\<b\>
、\<c\>
。也就是说,输出应该是
$ {some command here}
a
b
c
我写了下面的命令。但是,这会将那些仅包含空格或制表符的行视为段落的一部分(回想一下,仅包含空格的行不能被视为段落的一部分)。我认为这可以通过执行 awk
一次来改善。
$ awk -v RS= '/\<a\>/ {print [=12=],"\n"}' main.txt |\
awk -v RS= '/\<b\>/ {print [=12=],"\n"}' |\
awk -v RS= '/\<c\>/ {print [=12=]}'
a
b
c
是否有更有效的方法来实现这一目标?
您必须为空 RS
:
awk '!NF{[=10=]=""}1' main.txt > input.txt
这样,没有空白 (non-empty) 行将被视为段落的一部分,并且您消除了这些空白成为您的模式之一的可能性。实际上很难成为模式的一部分(但并非不可能),但是统一段落是很有可能的,所以这个输入"a\n \nb\n\c"
将被认为是一个匹配所有模式的段落。
当然,您必须 运行 awk
一次来测试每个段落的所有模式。但是,即使像现在这样一次一次,如果您准备好输入,它也会起作用。
awk -v RS= '/\<a\>/ && /\<b\>/ && /\<c\>/{print [=11=],"\n"}' input.txt