我拥有包含 单列和两列的数据行。我想要做的是 只包含2列的提取行。只有基于具有AWK的列数过滤行
0333 foo
bar
23243 qux
产生:
0333 foo
23243 qux
注意,他们都以空格隔开,即使是行只有一个列 你在一开始有标签。
这样做的方法是什么?
我试过,但失败:
awk '$1!="";{print $1 "\t" $2}' myfile.txt
enter code here
我拥有包含 单列和两列的数据行。我想要做的是 只包含2列的提取行。只有基于具有AWK的列数过滤行
0333 foo
bar
23243 qux
产生:
0333 foo
23243 qux
注意,他们都以空格隔开,即使是行只有一个列 你在一开始有标签。
这样做的方法是什么?
我试过,但失败:
awk '$1!="";{print $1 "\t" $2}' myfile.txt
enter code here
您需要使用变量NF
(字段数)来控制动作,如下面的成绩单:
$ echo '0333 foo
> bar
> 23243 qux' | awk 'NF==2{print}{}'
0333 foo
23243 qux
这将如果字段数是两个,则打印该行,否则它将不执行任何操作。我有(似乎)奇怪的构造NF==2{print}{}
的原因是因为如果没有规则匹配一条线,默认情况下会打印awk
的某些实现。空命令{}
保证这不会发生。
如果你足够幸运,有那些不这样做的一个,你可以逃脱:
awk 'NF==2'
但第一个解决方案上面会在都案件工作。
awk '(NF==2){print}' test.txt
awk 'NF==2' file
为什么不'AWK 'NF == 2 {打印} {} {} {} {} {} {}''?? NF == 2就足够了。 – 2010-08-03 08:54:57
@Mark,如果不指定默认操作,默认情况下将打印'awk'的某些实现。我的代码也适用于这些。你的机器人被你的GNU awk破坏了,我们中的一些人必须编写可移植的代码:-)我会澄清。 – paxdiablo 2010-08-03 09:13:16
@ pax,一种awk实现,其行为与你描述的方式相当相似。据我所知,awk的历史可以追溯到v7,并且手册中清楚地描述了它的行为:“例如,程序长度> 72打印所有长度超过72个字符的输入行。” – 2012-04-26 16:24:09