0

我在 unix 上有一个文件,其中包含几行带有“wonder”一词的行。
(在包含它的每一行中只有一个奇迹实例)
我想提取包含“奇迹”的第 n 次出现的行,以及在那之前和之后的 x 行。

感谢对允许我进行上述操作的脚本的帮助。

4

3 回答 3

2

使用 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
于 2013-11-12T04:10:45.633 回答
0

使用grep,您还可以通过使用-C标志使用单线实现此目的

grep -m N -C x wonder file | tail -n 2*x+1

您必须2*x+1用相应的数字替换。

于 2013-11-12T07:11:15.417 回答
0

您可以使用 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 来处理这样的事情。)

于 2013-11-12T03:42:31.617 回答