假设文本文件包含分别以foo
和bar
开头的行。进一步假设我想只打印以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