簡體   English   中英

使用awk和grep提取負/正浮點數

[英]Extract negative/positive float number with awk and grep

我正在尋找一種從.txt文件中提取負/正浮點數的方法。 到目前為止,我使用以下指令沒有成功:

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 =”之后的所有浮點數的方法。 例如,對於第二個k,我想將值-0.0333 0.0000 0.0000保存到output.dat文件中。

到目前為止,當我執行前面的代碼時,我似乎無法考慮k = -0.0333前面的“-”符號,而且我不明白為什么?

你能幫忙嗎? 提前致謝。

awk的默認字段分隔符是空格序列。 由於=-之間沒有空格,因此awk不會將它們拆分為不同的字段。

如果將其更改為space和= ,則要提取的字段將位於$2$3$4

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

我也在awk本身中使用了/k =/過濾器,不需要grep

awk中的另一個,與字段無關,但它在匹配記錄中搜索浮點數:

$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM