我正在寻找一种从.txt文件中提取负/正浮点数的方法。到目前为止,我使用了以下指令但未取得任何成功:
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
input.dat的简单预览是:
Sub UpdateLTP()
Sheets("Long Term Plan").Select
Range("A1").Select
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.ClearComments
Range("A1").Select
Sheets("Data").Select
Dim rng As Range, cell As Range
Set rng = Range("AA2:AA" & Range("AA" & Rows.Count).End(xlUp).Row)
For Each cell In rng
If cell.Value <> "" Then
Sheets("Long Term Plan").Range(cell.Value).AddComment cell.Offset(0, -1).Value
End If
Next cell
End Sub
基本上,我正在寻找一种方法来提取&#34; k =&#34;之后的所有浮点数。例如,对于第二个k,我想将值 -0.0333 0.0000 0.0000 保存到output.dat文件中。
到目前为止,当我执行上一段代码时,我似乎无法考虑&#34; - &#34;在k = -0.0333前面签名,我不明白为什么?
你能帮帮忙吗?提前谢谢。答案 0 :(得分: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
。
答案 1 :(得分: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