2010-08-03 74 views
16

我拥有包含 单列和两列的数据行。我想要做的是 只包含2列的提取行。只有基于具有AWK的列数过滤行

0333 foo 
bar 
23243 qux 

产生:

0333 foo 
23243 qux 

注意,他们都以空格隔开,即使是行只有一个列 你在一开始有标签。

这样做的方法是什么?

我试过,但失败:

awk '$1!="";{print $1 "\t" $2}' myfile.txt 

enter code here 

回答

23

您需要使用变量NF(字段数)来控制动作,如下面的成绩单:

$ echo '0333 foo 
> bar 
> 23243 qux' | awk 'NF==2{print}{}' 
0333 foo 
23243 qux 

这将如果字段数是两个,则打印该行,否则它将不执行任何操作。我有(似乎)奇怪的构造NF==2{print}{}的原因是因为如果没有规则匹配一条线,默认情况下会打印awk的某些实现。空命令{}保证这不会发生。

如果你足够幸运,有那些不这样做的一个,你可以逃脱:

awk 'NF==2' 

但第一个解决方案上面会在案件工作。

+0

为什么不'AWK 'NF == 2 {打印} {} {} {} {} {} {}''?? NF == 2就足够了。 – 2010-08-03 08:54:57

+2

@Mark,如果不指定默认操作,默认情况下将打印'awk'的某些实现。我的代码也适用于这些。你的机器人被你的GNU awk破坏了,我们中的一些人必须编写可移植的代码:-)我会澄清。 – paxdiablo 2010-08-03 09:13:16

+0

@ pax,一种awk实现,其行为与你描述的方式相当相似。据我所知,awk的历史可以追溯到v7,并且手册中清楚地描述了它的行为:“例如,程序长度> 72打印所有长度超过72个字符的输入行。” – 2012-04-26 16:24:09

5
awk '(NF==2){print}' test.txt