我在 unix 上有一个文件,其中包含几行带有“wonder”一词的行。
(在包含它的每一行中只有一个奇迹实例)
我想提取包含“奇迹”的第 n 次出现的行,以及在那之前和之后的 x 行。
感谢对允许我进行上述操作的脚本的帮助。
使用 2-pass 方法:
awk -v n=3 -v x=5 '
BEGIN { ARGV[ARGC] = ARGV[ARGC-1]; ARGC++ }
NR == FNR {
if ( /wonder/ && (++c == n) ) {
for (i=0; i<=x; i++) {
tgts[FNR-i]
tgts[FNR+i]
}
}
next
}
FNR in tgts
' file
使用grep
,您还可以通过使用-C
标志使用单线实现此目的
grep -m N -C x wonder file | tail -n 2*x+1
您必须2*x+1
用相应的数字替换。
您可以使用 grep -n -m 4 打印前 4 个匹配项的行号,因此 grep -n -m 4 | tail -1 会给你第四场比赛的行号。
MATCH=4; LINES=5
span=$(($LINES*2+1))
line=`grep -n -m $MATCH wonder file | tail -1`
如果您有匹配的行号,那么您可以打印带有头尾的 +/- N 行...
end=$(($line+$LINES))
head -$end file |tail -$span
或者您可以使用 awk、计算匹配数并在匹配后打印行。更难的部分是在此之前倒带打印 N 行。您可以缓冲行,但这更难。
(我通常使用 perl 来处理这样的事情。)