Shell-Script
如何從問題中的輸出中提取第一列中的正數?
我正在執行 Ubuntu 14.04.1 LTS 64 位,
Bash 4.3.11(1)-release
我有一個名為harminv
產生輸出的程序,如下所示:$ h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 # harminv: 1902 inputs, dt = 0.1 frequency, decay constant, Q, amplitude, phase, error # searching frequency range 0.31831 - 0.477465 # using 200 spectral basis functions, density 6.60692 -2.14026, 3.511909e-05, 30471.5, 0.922444, 1.26783, 1.383955e-06 2.14013, 2.052504e-05, 52134.7, 0.920264, -1.27977, 3.426846e-07 # harminv: 2/6 modes are ok: errs <= 1.000000e-01 and inf * 3.426846e-07 , amps >= 0, 9.000000e-01 * 0.922444, |Q| >= 10
當
-v
省略 (verbose) 選項時,我有一個更整潔的輸出,如下所示:$ h5totxt hsli0.126.h5 | harminv -t 0.1 -w 2-3 -a 0.9 -f 200 frequency, decay constant, Q, amplitude, phase, error -2.14026, 3.511909e-05, 30471.5, 0.922444, 1.26783, 1.383955e-06 2.14013, 2.052504e-05, 52134.7, 0.920264, -1.27977, 3.426846e-07
在這兩種情況下,我都希望能夠在輸出的第一列中提取正數,但不知道該怎麼做,除了我可以使用
sed
orawk
。如果有人指出我正確的方向,我將不勝感激,我的目標是記錄每個正數以針對其他一些變數進行繪圖。
使用 sed
這將只列印以正數開頭的行:
sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'
結合您的一個管道,它看起來像:
h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'
這個怎麼運作
-n
這告訴
sed
不要列印任何行,除非我們明確要求它。
s/^\([[:digit:]][^ ,]*\).*/\1/p
這告訴
sed
查找以正數開頭的行並僅列印該數字。在正則表達式中,
^
僅匹配行首。[[:digit:]]
匹配任何數字。[^ ,]*
匹配該數字後面的任何內容,除了空格或逗號。所有這些都用括號分組,以便我們稍後可以將數字稱為\1
。然後將整行替換為數字,並且通過p
選項,我們告訴sed
列印它。一種用於
[0-9]
匹配數字。隨著 unicode 字型的出現,這不再可靠。然而,表達式[[:digit:]]
是 unicode 安全的。使用擴展正則表達式的替代方案
如果您使用的是 GNU sed(所有 linux 系統都是如此),那麼該
-r
選項可用於獲取擴展的正則表達式。使用擴展的正則表達式,用於分組的括號不需要轉義:sed -rn 's/^([[:digit:]][^ ,]*).*/\1/p'
在 OSX 或其他 BSD 系統上,使用
-E
.-r
使用 awk
這也一樣,但使用
awk
:awk -F, '/^[[:digit:]]/{print $1}'
結合您的管道:
h5totxt hsli0.126.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | awk -F, '/^[[:digit:]]/{print $1}'