2014-11-05 26 views
0

我有一个文件,如如下:印刷生产线超过三个字段和线以上

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

grep做到这一点:

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

这看起来具有文本的至少四个区块的线。然后,-B1在匹配的行之前打印匹配和1行B

随着awk你可以说:

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

它存储在一个变量ff=$0当前行。然后,当匹配NF>3(即一行中多于3个字段)时,它将存储的行与当前行一起打印。这可能会导致打印重复行的问题。

为了您指定的文件返回:

scaf_457 784 5 
457 4578 784 487 4578 

man grep

-B NUM,--before上下文语境领先的= NUM​​

打印张数线在匹配行之前。在连续的匹配组之间放置一个包含组分隔符的 行(在 - 组分隔符下描述)。使用-o或--only-matching选项,这不起作用并给出警告。

+1

这个很酷你可以用awk做什么,但是当涉及到这些类型的代码时,我真的无法写出它们。关于如何学习awk到这样的学位还是只有通过实践才能得到什么建议? – Lucia 2014-11-05 09:43:51

+1

我真的很喜欢这个教程:[Idiomatic awk](http://backreference.org/2010/02/10/idiomatic-awk/)。除此之外,它就像所有的语言一样:你通过练习学习它,当然,阅读好的代码。在[SO]的[awk]标签中出现一段时间,您肯定会学到很多东西,我们都这么做! – fedorqui 2014-11-05 09:56:25

+0

作为一个侧面和偏离主题的笔记,看到你已经获得了特权upvote。随意做到这一点,就像我在你的个人资料中看到你从未做过的一样! :) – fedorqui 2014-11-05 09:59:22