【问题标题】:how to grep a N (7) column row before a grepped number from a long text file如何在长文本文件中的 grep 数字之前 grep N (7) 列行
【发布时间】:2021-03-11 17:25:40
【问题描述】:

我有一个空间格式的文本文件。 在前“N”行之后,文件将有 7 列行,然后将有“X”行(X 是这 7 列行中第 6 列的值)。然后会有另一行有 7 列,它将有更多的“Y”子行(Y 是这 7 列行中第 6 列的值)。并且行的出现会达到一些固定的数字,比如 40。 示例在这里 (我跳过了前几行)。

  2.857142857143E-01 2.857142857143E-01-2.857142857143E-01         1  1533   9  1.0
           1  -3.52823873905418
           2  -3.52823873905417
           3  -1.77620635653680
           4  -1.77620635653680
           5  -1.77620570068355
           6  -1.77620570068354
           7  -1.77620570066112
           8  -1.77620570066112
           9  -1.60388273192418

 1.428571428571E-01 1.428571428571E-01-1.428571428571E-01         2  1506   14  8.0
           1  -3.52823678441811
           2  -3.52823678441810
           3  -1.77620282216865
           4  -1.77620282216865
           5  -1.77619365786042
           6  -1.77619365786042
           7  -1.77619324280126
           8  -1.77619324280125
           9  -1.60387130881086
          10  -1.60387130881086
          11  -1.60387074066972
          12  -1.60387074066972
          13  -1.51340357895078
          14  -1.51340357895078
 1.000000000000E+00 4.285714285714E-01-1.428571428571E-01        20  1524   51 24.0
           1  -3.52823580096110     
           2  -3.52823580096109     
           3  -1.77624472106293     
           4  -1.77624472106293     
           5  -1.77623455229910     
           6  -1.77623455229909     
           7  -1.77620473017160     
           8  -1.77620473017159     
           9  -1.60387169115834     
          10  -1.60387169115834     
          11  -1.60386634866654     
          12  -1.60386634866654     
          13  -1.51340851656332     
          14  -1.51340851656332     
          15  -1.51340086887553     
          16  -1.51340086887553     
          17  -1.51321967923767     
          18  -1.51321967923766     
          19  -1.40212716813452     
          20  -1.40212716813451     
          21  -1.40187887062753     
          22  -1.40187887062753     
          23 -0.749391485667459     
          24 -0.749391485667455     
          25 -0.740712218931955     
          26 -0.740712218931954     
          27 -0.714030906779278     
          28 -0.714030906779278     
          29 -0.689087278411268     
          30 -0.689087278411265     
          31 -0.687054399753234     
          32 -0.687054399753233     
          33 -0.677686868127079     
          34 -0.677686868127075     
          35 -0.405343895324740     
          36 -0.405343895324739     
          37 -0.404786479693490     
          38 -0.404786479693488     
          39 -0.269454266134757     
          40 -0.269454266134755     
          41 -0.267490250650300     
          42 -0.267490250650296     
          43 -0.262198373307171     
          44 -0.262198373307170     
          45 -0.260912148881762     
          46 -0.260912148881761     
          47 -9.015623907768122E-002
          48 -9.015623907767983E-002
          49  0.150591609452852     
          50  0.150591609452856     
          51  0.201194203960446  

我想从我的文本文件中 grep 一个特定的数字并这样做,我使用

awk -v c=2 -v t=$GREP 'NR==1{d=$c-t;d=d<0?-d:d;v=$c;next}{m=$c-t;m=m<0?-m:m}m<d{d=m;v=$c}END{print v}' case.dat
Here $GREP is 0.2011942 which prints the last row (it will change according to different file)

51  0.201194203960446

我也想用这个数字打印标题行,即我的脚本应该打印,

51  0.201194203960446
1.000000000000E+00 4.285714285714E-01-1.428571428571E-01        20  1524   51 24.0.

如何打印这个 grepped 数字的标题行?

我有想法,但我无法以脚本格式实现它。 简单地说,使用我的脚本 grep 数字并打印该数字之前有 7 列的第一行。

【问题讨论】:

    标签: awk grep


    【解决方案1】:

    这可能就是你要找的东西

    awk -v t="$GREP" '
        BEGIN             { sub("\\.", "\\.", t) }
        NF > 2            { header=$0; next }
        NF == 2 && $2 ~ t { printf("%s %s\n%s\n", $1, $2, header) }
    ' file
    

    如果您想要打印严格的七列标题(该标题在您的示例数据中包含 6 列,而不是 7 列),您可以将 NF &gt; 2 替换为 NF == 7


    在评论“你能不能修改我的脚本,以便它可以 grep 到 13 个十进制数”之后更新:

    awk -v t="$GREP" '
        BEGIN             { if (match(t, "\\.")) {
                                t = substr(t, 1, RSTART + 13)
                                sub("\\.", "\\.", t)
                            }
                          }
        NF > 2            { header=$0; next }
        NF == 2 && $2 ~ t { printf("%s %s\n%s\n", $1, $2, header) }
    ' file
    

    【讨论】:

    • 能否请您修改我的脚本,使其最多可以 grep 13 个十进制数字。因为第 14 位和第 15 位可能有两个相似的数字,而我想同时打印它们
    • 示例:我的 grep 命令给出 0.727510083482439 而在下一列中我有 0.727510083482441,所以我想将我的 grep 限制为小数点后 13 位以打印这两个数字。
    • 你是对的,我的标题行有六列。因为第二列和第三列没有分开。我不知道如何认为它们是分开的。
    • 我想限制我的脚本 awk -v c=2 -v t=$GREP 'NR==1{d=$c-t;d=d&lt;0?-d:d;v=$c;next}{m=$c-t;m=m&lt;0?-m:m}m&lt;d{d=m;v=$c}END{print v}' case.dat,使其只打印 13 个十进制数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多