打印匹配行和匹配行中的第 n 行

打印匹配行和匹配行中的第 n 行

我正在尝试打印匹配行和匹配行中的第四行(包含我正在搜索的表达式的行)。

我一直在使用以下代码: sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt

但这只会打印匹配的行。

这仅打印第四行。 awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt

我只需要打印匹配的行和第四行。

答案1

在 awk 中,你可以这样做

awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`

或者

awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`

解释

第一个解决方案找到所有匹配的行pattern。当它找到匹配项时,它将记录号 ( NR) 存储在数组中nr。它还存储NR同一数组中的第四条记录。这是由nr[NR+4].NR然后检查每个记录 ( ) 以查看它是否存在于nr数组中,如果存在则打印该记录。

第二个解决方案的工作方式本质上是相同的,除了当它遇到 e 时,pattern它​​会打印该行,然后将其前面的第四条记录存储在数组中nr,然后转到下一条记录。然后,当awk遇到第四条记录时,该NR in nr块将被执行,并在之后打印该+4记录。

例子

这是一个示例数据文件,sample.txt.

$ cat sample.txt 
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16

使用第一个解决方案:

$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt 
4 blah
8
10 blah
14

使用第二种解决方案:

$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt 
4 blah
8
10 blah
14

答案2

您可以尝试-A使用 选项grep,该选项指定应打印匹配行之后的行数。将其与 结合起来sed,您将获得所需的行。

grep -A 4 pattern input.txt | sed -e '2,4d'

使用sed,我们删除从第二行到第四行的 。

答案3

sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt

我只是在打印之前删除适当的行{ 3,5d ; p }

答案4

awk 'c&&!--c;/img class=\"devil_icon/{c=4};/img class=\"devil_icon/' input.txt

您本质上是在进行查找和替换。您可以只添加一个寻找到同一个命令中,它会打印它们:)

awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt

相关内容