如果关键字存在,只保留第n行



假设文本文件包含分别以foobar开头的行。进一步假设我想只打印以bar开头的每第四行;应始终打印以foo开头的行。

foo bar qux
   # Deliberate empty line
bar baz 1
bar baz 2
bar baz 3
bar baz 4
bar baz 5
bar baz 6
bar baz 7
bar baz 8
# A miscellaneous code comment

下面的代码每四行打印一次,不管第一个单词是什么,因此这不是我要找的。

awk '/^bar/ NR == 1 || NR % 4 == 0' infile

正确的代码是什么(优先使用awk)?

编辑:

感谢fedorqui的出色建议。考虑到输入文件中可能出现空行和注释,我使用以下代码:

user$ awk '!/^bar/ || (/^bar/ && !(++c%4))' file
foo bar qux
   # Deliberate empty line
bar baz 4
bar baz 8
# A miscellaneous code comment

使用计数器:

awk '/^foo/ || (/^bar/ && !(++c%4))' file

打印完成以下任意一项的行:

  • 以"foo"开头
  • 以"bar"开头,这发生了第四次,第八次……也就是说,每四次一行以"bar"开头。

实际操作:

$ cat a
foo1
bar1
bar2
bar3
foo2
foo3
bar4
bar5
bar6
bar7
bar8
bar9
$ awk '/^foo/ || (/^bar/ && !(++c%4))' a
foo1
foo2
foo3
bar4
bar8

这应该能奏效:

 awk '/^bar/ && NR % 4 == 0 || /^foo/' infile

最新更新