从匹配行打印匹配行和第n行


18

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

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

但这仅打印匹配的行。

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

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


使用 egrep "pattern" -A4
Valentin Bajrami

@ val0x00ff也会打印之间的行..也就是说:它从匹配的行开始打印接下来的4行
debal

您正在说“我正在尝试从匹配行打印匹配行和第四行”。这样grep -A 4 "pattern" file | sed -n '4p'做确实可以满足您的要求,除非我误解了您
Valentin Bajrami

不,不是。上面代码的输出</td>不是第四行
debal 2013年

Answers:


18

在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数组中(如果有的话)。

第二个解决方案的工作方式基本上相同,除了遇到第一个解决方案时,它会pattern打印该行,然后将第4条记录存储在数组中nr,然后转到下一条记录。然后,当awk遇到此第4条记录时,该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

3
不错,+ 1。您在awk这里使用了许多快捷方式,是否可以添加一个简短的解释(诸如在awk中隐含print和数组是关联数组之类的东西)?
terdon

同意@terdon,请您解释一下代码。
十月

@slm感谢您改进并提供完整答案!
Valentin Bajrami

1
感谢您的回答,我也学到了新东西。
slm

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

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


您的表达会产生错误:sed: -e expression #1, char 18: unknown option to s'`
矿物

4

您可以尝试使用的-A选项grep,该选项指定应在匹配行之后打印多少行。加上sed,您将获得所需的行。

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

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


3
假设pattern文件中有一个匹配项。
terdon

2

这是Perl中可以处理任意数量的匹配行的方法:

perl -ne '/pattern/ && do{$c=$.; print}; $.==$c+4 && print' file > new_file`

在Perl中。特殊变量$.是当前行号。因此,每次找到匹配的行时pattern,我都会打印该行并将其行号保存为$c。然后,当当前行号比以前打印的行号多4时,我再次打印。


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

您实际上是在进行查找和替换。您可以在同一个命令中添加一个查找,然后将它们全部打印出来:)

awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.