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

时间:2016-08-08 08:52:28

标签: bash awk filtering

假设文本文件分别包含以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

2 个答案:

答案 0 :(得分:4)

只需使用计数器:

json report

这将打印完成以下任何一项的行:

  • 以" foo"
  • 开头
  • 以" bar"开头这种情况发生在第4次,第8次......也就是说,每隔4次,一行以" bar"开始。

看到它的实际效果:

var dealerSource = new ol.source.Vector();
function dealerStyle(feature) {
    var style = new ol.style.Style({
        image: new ol.style.Circle({
            radius: 6,
            stroke: new ol.style.Stroke({
                color: 'white',
                width: 2
            }),
            anchor: [1.5, 1.5],
            fill: new ol.style.Fill({
                color: 'green'
            })
        })
    });
    return [style];
}

答案 1 :(得分:-3)

这应该可以解决问题:

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