打印超过三个字段的行和上面的行

时间:2014-11-05 09:26:39

标签: awk grep

我有一个如下文件:

scaf_1245 457 1
457
scaf_457 784 5
457 4578 784 487 4578
scaf_847 487 4
457 487 487

如何使用awk和grep打印包含三个以上字段的行(仅包含数字的行)及其上方的行?

我知道:

awk 'NF>3' file 

grep -B 1 pattern

Desired output:

scaf_457 784 5
457 4578 784 487 4578

但不知道如何将这些结合起来。

1 个答案:

答案 0 :(得分:1)

grep这样做:

grep -B1 ".* .* .* .*" file

这将查找具有至少四个文本块的那些行。然后,-B1在匹配的行之前打印匹配和1行B

使用awk,您可以说:

awk 'NF>3 {print f; print} {f=$0}' file

它将当前行存储在f变量f=$0中。然后,当NF>3匹配时(即,一行中超过3个字段),它会将存储的行与当前行一起打印出来。这可能会产生重复打印线的问题。

对于您的给定文件,它返回:

scaf_457 784 5
457 4578 784 487 4578

来自man grep

  

-B NUM, - before-context = NUM​​

     

在匹配行之前打印前导上下文的NUM行。放置一个   包含组分隔符的行(在下面描述    - 连续的匹配组之间的--group-separator)。使用-o或--only-matching选项,这没有任何效果,并且会给出警告。