2017-08-07 6 views
0

.txtファイルから負の/正の浮動小数点数を抽出する方法を探しています。これまでのところ私は成功せず、次の命令を使用:awkとgrepで負/正の浮動小数点数を抽出します。

grep "k = " ./input.dat | awk '{printf "%6.4f %6.4f %6.4f\n", $3, $4, $5}' >> output.dat 

input.datの簡単なプレビューがされています。基本的に、私は「後にすべての浮動番号を抽出する方法を探しています

 k = 0.0000 0.0000 0.0000 ( 1139 PWs) bands (ev): 
-5.7114 6.2665 6.2665 6.2665 8.8226 8.8226 8.8226 9.5426 
13.9932 13.9932 14.1707 17.5026 17.5026 17.5026 21.6082 29.3698 
29.3698 29.3698 30.4639 30.4639 31.6370 31.6370 31.6370 35.4938 
35.4938 35.4938 41.1356 41.1356 41.1356 41.5299 44.9464 44.9464 
46.8590 46.8590 47.5946 
     k =-0.0333 0.0000 0.0000 ( 1163 PWs) bands (ev): 
-5.7067 6.2326 6.2452 6.2452 8.8104 8.8498 8.8498 9.5751 
13.9526 13.9985 14.1923 17.5111 17.5111 17.5309 21.6438 29.2831 
29.2831 29.3758 30.3994 30.4050 31.6797 31.6972 31.6972 35.5310 
35.5310 35.5612 41.0551 41.0974 41.0974 41.6060 44.8492 44.9336 
46.7124 46.8519 47.5656 

k = "である。たとえば、2番目のkでは、-0.0333 0.0000 0.0000の値をoutput.datファイルに保存します。

これまでのコードを実行すると、k = -0.0333の前にある " - "記号を考慮していないように見えますが、なぜそれが分かりませんか?

助けてもらえますか?前もって感謝します。

+0

は、 '='と '-'ので、' = -0.0333'つのフィールドがある間にスペースはありません。 – melpomene

答えて

1

別、分野に縛られないが、それは一致するレコードに山車を検索:

$ awk '$1 OFS $2 ~/k =/ {   # can I do this in awk? oh wow, it works 
    b=""            # reset buffer var 
    while(match($0,/-?[0-9]+\.[0-9]+/)) {    # match for float 
     b=b (b==""?"":OFS) substr($0,RSTART,RLENGTH) # buffer it 
     $0=substr($0,RSTART+RLENGTH)     # truncate $0 
    } 
    print b            # output buffer 
}' file 
0.0000 0.0000 0.0000 
-0.0333 0.0000 0.0000 
3

awkのデフォルトのフィールドセパレータは、空白のシーケンスです。 =-の間にスペースがないため、 awkはそれらを異なるフィールドに分割しません。

あなたがスペースと=に、あなたが抽出したいフィールドが$2$3$4になることを変更した場合:私はまた、awkは、それ自体で/k =/フィルタを使用

awk -F' =' '/k =/ {printf "%6.4f %6.4f %6.4f\n", $2, $3, $4}' ./input.dat 

grepための必要はありません。

awkでは
関連する問題