2009-12-04 43 views
1

我的數據是這樣的:的Unix awk命令的正則表達式的問題

# data_display 

ab as we hj kl 
12 34 45 83 21 
45 56 98 45 09 

我只需要單獨的第一列,只有開始與數行。

我現在使用:

# data_display | awk '{ print $1 }' | grep "^[0-9]" 

有沒有什麼辦法能夠更優化它,就像在AWK本身使用正則表達式?

我對awk很新。

謝謝。

KK當然

回答

6

在awk中,正則表達式位於包含花括號的print語句之前。所以你的情況,awk的調用將是:

awk '/^[0-9]/ {print $1}' 
0

,您可以:

pax> echo 'ab as we hj kl 
12 34 45 83 21 
45 56 98 45 09' | awk '/^[0-9]/ {print $1}' 

爲您提供:

12 
45 

Awk命令由一個實際的模式來匹配和命令來運行的。如果沒有模式,該命令針對所有行運行。

2

您可以將grep的正則表達式awk命令直接:

data_display | awk '/^[0-9]/{ print $1 }' 
1

你可以使用cut代替awk

$ data_display | grep '^[0-9]' | cut -f 1 -d ' ' 
+0

爲什麼使用2個命令時,1已經這樣做......生產開銷 – ghostdog74 2009-12-04 11:57:20

+0

levislevis85,你應該總是測試你的假設。 awk是一種完整的編程語言,cut和grep是更簡單的工具。你測試過哪個開銷更大?我只是指向選項。 – Svante 2009-12-04 12:54:29

+0

無論如何,我認爲awk不能使用'$ 1'機制時會出現'cut'。有趣的是,將正則表達式從外部grep移動到awk腳本中幾乎沒有區別 - 因此「附加命令」的開銷似乎不重要。 – Svante 2009-12-04 13:00:15

1

爲了更加準確,請檢查實際數字(如果您有像1a這樣的數據,但這不是數字,但會使用迄今爲止給出的解決方案進行匹配。)

$ awk '$1+0==$1' file 

awk '$1 ~/^[0-9]+$/' file 
+0

很適合顯示正則表達式比較運算符「〜」 – 2009-12-04 14:52:51

1

切-d」'-f1文件名| grep'^ [0-9]'

這應該是最快的。因爲awk會將文件分類爲記錄和字段。

在這裏,我們正在最小化grep需要通過切割第一個字段來處理的數據量。