awk:从一组线中打印三行

Kaa*_*rtz 2 perl awk

我有一个包含行组的文本文件,从中我只需要每组中的前三行.

文件:

test1|pass
test1|pass
test1|pass
test1|pass
test1|pass
test2|fail
test2|fail
test2|fail
test2|fail
test3|pass
test3|pass
test3|pass
test3|pass
Run Code Online (Sandbox Code Playgroud)

预期产出:

test1|pass
test1|pass
test1|pass
test2|fail
test2|fail
test2|fail
test3|pass
test3|pass
test3|pass
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试了什么:

BEGIN {
        FS = "|"
}
        $1==x {
        if (NR % 5 <= 3) {
                print $0
        }
        next
}
{
        x=$1
        print $0
}

END {
        printf "\n"
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*hor 5

你可以像这样简洁地做到这一点:

awk -F'|' '++a[$1] <= 3' infile
Run Code Online (Sandbox Code Playgroud)

输出:

test1|pass
test1|pass
test1|pass
test2|fail
test2|fail
test2|fail
test3|pass
test3|pass
test3|pass
Run Code Online (Sandbox Code Playgroud)

说明

a是一个关联数组.我们使用每一行($1)的第一个元素作为键a并增加其值.然后将该值与之比较3,如果比较为真,则执行默认块({print $0}).