我擁有包含 單列和兩列的數據行。我想要做的是 只包含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