2017-08-07 720 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 =「。例如,對於第二個k,我想將值-0.0333 0.0000 0.0000保存到output.dat文件中。

到目前爲止,當我執行前面的代碼時,我似乎無法考慮k = -0.0333前面的「 - 」符號,我不明白爲什麼?

你能幫忙嗎?提前致謝。

+0

有'='和'-',所以'= -0.0333'是一個字段之間沒有空格。 – melpomene

回答

1

另在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 
3

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

如果更改空間和=然後要提取的字段將在$2$3$4

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

我也用於AWK本身/k =/過濾器,沒有必要爲grep