私は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
ますawk
。誰かが私に正しい方向を教えてくれれば幸いです。私の目標は、すべての正数を記録して他の変数についてプロットすることです。
ベストアンサー1
sedを使う
これにより、正数で始まる行だけが印刷されます。
sed -n 's/^\([[:digit:]][^ ,]*\).*/\1/p'
パイプラインの1つと組み合わせると、次のようになります。
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から安全です。
拡張正規表現の使用の代替
すべてのLinuxシステムの場合と同様に、GNU sedを使用している場合は、この-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}'