我有一个如下文件:
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
但不知道如何将这些结合起来。
答案 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选项,这没有任何效果,并且会给出警告。