用awk和grep提取负/正浮点数

时间:2017-08-07 19:08:51

标签: linux bash awk grep

我正在寻找一种从.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前面签名,我不明白为什么?

你能帮帮忙吗?提前谢谢。

2 个答案:

答案 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