我有一个简单的问题,在本论坛或awk学习网站上找不到这个问题。
我有一些awk代码匹配以数字开头的行,并打印该行的第6列:
/^[1-9]/ {
print $6
}
如何告诉它只打印匹配列的前50行?
我尝试使用我自己的下面的答案版本,我得到它打印50行。但是,现在我正在尝试选择我打印的50行。我通过跳过以数字开头并包含“残留”一词的行来完成此操作。然后我跳过5行以数字开头并包含'w'。这个方法就好像我只是跳过带有残留的行并从第一行开始打印,之后用数字开头。你知道为什么我的'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
}
答案 0 :(得分:3)
使用匹配计数器作为您的条件的一部分:
/^[1-9]/ && matched < 50 {
print $6
matched++
}
您也可以使用快捷方式方法:
/^[1-9]/ { print $6; matched++ }
matched == 50 { exit }
但如果 producer 命令无法正常处理SIGPIPE
,那么这可能并不总是在pipline上工作。
答案 1 :(得分:2)
awk '/^[1-9]/ { if (num_printed++ < 50) print $6 }'
每次找到匹配项时,这会增加num_printed
,并打印出前50条这样的行,无论输入文件中的行位于何处。
这将读取所有输入。如果提前退出是正常的,那么您可以使用:
awk '/^[1-9]/ { print $6; if (++num_printed == 50) exit }'
注意从后增量切换到预增量。