1

我有一个简单的问题,在这个论坛或 awk 学习网站上几乎找不到。

我有一些 awk 代码匹配以数字开头的行,并打印该行的第 6 列:

/^[1-9]/ {   
print $6 
}

我如何告诉它只打印匹配列的前 50 行?


附加问题

我尝试使用我自己的以下答案版本,并打印了 50 行。但是,现在我正在尝试选择要打印的 50 行。我通过跳过以数字开头并包含“残基”一词的行来做到这一点。然后我跳过以数字开头并包含“w”的 5 行。这种方法的工作方式就像我只是跳过带有残留物的行并从第一行开始打印,然后以数字开头。你知道为什么我的'w'没有被考虑。

#!/usr/bin/awk -f

BEGIN {
    line  = 0;
    skipW = 0;
}


# Ignore all lines beginning with a number until I find one I'm interested in.
/^[0-9]+ residue/ { next }

# Ignore the first five lines beginning with a number followed by a 'w'.
/^[0-9]+ w/ { 
    skipW += 1;
    if (skipW <= 5) next
}

# For all other lines beginning with a number, perform the following.  If we are
# "printing", increment the line count.  When we've printed 50 lines turn off
# printing from that point on.
/^[0-9]+/ { 
    ++line
    if ((line > 0) && (line <= 50)) print $6
}
4

2 回答 2

3

使用匹配计数器作为条件的一部分:

/^[1-9]/ && matched < 50 {
    print $6
    matched++
}

您也可以使用快捷方式:

/^[1-9]/ { print $6; matched++ }
matched == 50 { exit }

但是,如果生产者命令不能SIGPIPE正常处理,这可能并不总是适用于管道。

于 2012-10-03T18:08:15.753 回答
2
awk '/^[1-9]/ { if (num_printed++ < 50) print $6 }'

num_printed每次找到匹配项时都会增加并打印出前 50 行这样的行,无论这些行在输入文件中的什么位置。

这会读取所有输入。如果可以提前退出,那么您可以使用:

awk '/^[1-9]/ { print $6; if (++num_printed == 50) exit }'

注意从后增量到前增量的切换。

于 2012-10-03T18:12:16.403 回答