2010-08-03 66 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