我的數據是這樣的:的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當然
我的數據是這樣的:的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當然
在awk中,正則表達式位於包含花括號的print語句之前。所以你的情況,awk的調用將是:
awk '/^[0-9]/ {print $1}'
,您可以:
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
命令由一個實際的模式來匹配和命令來運行的。如果沒有模式,該命令針對所有行運行。
您可以將grep的正則表達式awk命令直接:
data_display | awk '/^[0-9]/{ print $1 }'
你可以使用cut
代替awk
:
$ data_display | grep '^[0-9]' | cut -f 1 -d ' '
爲了更加準確,請檢查實際數字(如果您有像1a這樣的數據,但這不是數字,但會使用迄今爲止給出的解決方案進行匹配。)
$ awk '$1+0==$1' file
或
awk '$1 ~/^[0-9]+$/' file
很適合顯示正則表達式比較運算符「〜」 – 2009-12-04 14:52:51
切-d」'-f1文件名| grep'^ [0-9]'
這應該是最快的。因爲awk會將文件分類爲記錄和字段。
在這裏,我們正在最小化grep需要通過切割第一個字段來處理的數據量。
爲什麼使用2個命令時,1已經這樣做......生產開銷 – ghostdog74 2009-12-04 11:57:20
levislevis85,你應該總是測試你的假設。 awk是一種完整的編程語言,cut和grep是更簡單的工具。你測試過哪個開銷更大?我只是指向選項。 – Svante 2009-12-04 12:54:29
無論如何,我認爲awk不能使用'$ 1'機制時會出現'cut'。有趣的是,將正則表達式從外部grep移動到awk腳本中幾乎沒有區別 - 因此「附加命令」的開銷似乎不重要。 – Svante 2009-12-04 13:00:15