Shell-Script

如何從問題中的輸出中提取第一列中的正數?

  • February 20, 2015

我正在執行 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

在這兩種情況下,我都希望能夠在輸出的第一列中提取正數,但不知道該怎麼做,除了我可以使用sedor awk。如果有人指出我正確的方向,我將不勝感激,我的目標是記錄每個正數以針對其他一些變數進行繪圖。

使用 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}'

引用自:https://unix.stackexchange.com/questions/185813