首页 > 解决方案 > 在文件中搜索号码

问题描述

如何用 awk 或更合适的方式编写程序,如果需要,它将搜索和写入数字?

我有一个文件

0.0000000  -0.0000000  -0.0000000
   -0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000  -0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   1.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000  -0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000   0.0000000   0.0000000  -0.0000000  -0.0000000
   -0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   1.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000  -0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000   0.0000000   0.0000000  -0.0000000  -0.0000000
   -0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   1.0000000   0.0000000   0.0000000   0.0000000
    0.0000000  -0.0000000  -0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000  -0.0000000
   -0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000   1.0000000   0.0000000  -0.0000000
    0.0000000   0.0000000   0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000
   -0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000  -0.0000000  -0.0000000   0.0000000  -0.0000000
    0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000  -0.0000000  -0.0000000   0.0000000  -0.0000000   0.0000000   0.0000000
    0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   1.0000000   0.0000000
    0.0000000  -0.0000000   0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000   0.0000000   0.0000000  -0.0000000  -0.0000000
   -0.0000000   0.0000000  -0.0000000   0.0000000  -0.0000000  -0.0000000  -0.0000000  -0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
    0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   1.0000000

 CHECK OF COMPUTED DEPENDENT VARIABLES FROM NORMAL EQUATIONS

   0.0921839
 -10.1319866
   3.6264119
  11.7262830
 -68.8050967
   0.4522270
   0.3373249
 -34.8902892
 -27.7340970
   1.3273557
  23.1789217
 -21.5330918
  25.0183830
 -41.1342361
  -9.4139492
  67.1457087
 -86.1216513
   0.4522270
   0.9082617
  -3.1807870
  -1.9716431
  -1.1840182
  -3.7907675
  -1.4510456
  -1.1857174
  -4.8308521
  -1.3112015
   1.1611722
  -6.1369640
  -3.5550976
  -4.7666450
  -0.6706241
  -2.2754214
  -2.9594634
  -1.9888614
  -0.9457585
  -0.9477964
 -11.1808337
  -9.6823234
  -6.0165193
  -4.6256076
 SUM OF ABSOLUTE VALUES OF CHECKS IS 0.188070D-10
                      Input-Output in F Format

No.  Curve    Input Param.        Correction     Output Param.    Standard Deviation
 9      0     43.8999000000      2.4976090669     46.3975090669      0.3593736560
10      0      0.0883000000     -0.0008250571      0.0874749429      0.0006398321
11      0      2.5816650000     -0.0033525536      2.5783124464      0.0109309501
12      0      1.0000000000      0.0481656121      1.0481656121      0.0288356492
13      0      1.0000000000     -3.1951648165     -2.1951648165      2.0603892225
14      0      0.0000000000     -0.0002127349     -0.0002127349      0.0017416849
15      0      0.2175000000      0.0015097548      0.2190097548      0.0015804101
16      0     80.4198910000     -4.3952312032     76.0246597968      0.1589276670
17      0      1.0000000000     -2.5673410799     -1.5673410799      0.0871801072
18      0      1.0000000000   -205.4932338114   -204.4932338114     14.4204106262
19      0      3.0000000000     -0.2245759531      2.7754240469      0.0822226758
20      0      1.9424000000      0.1257878585      2.0681878585      0.0430855010
21      0      1.0000000000    -18.7946060528    -17.7946060528      2.0771181978
22      0      1.0000000000     -2.8342434886     -1.8342434886      0.2995629339
23      0      3.5047300000     -0.3237559753      3.1809740247      0.0128735907
24      0      5.5942300000      0.6858315083      6.2800615083      0.0486118539
25      0      0.3827000000     -0.0227502151      0.3599497849      0.0041910161

我想得到

46.397509
0.359373
0.087474
0.000639
....

那么如何在 F 格式的字符串 Input-Output 之后以 9 开​​头,然后以 %2.6f 格式(小数点后 6 位)写入 $5 并以 %2.6f 格式(小数点后 6 位)写入 $6 到下一行

输入文件中有一个类似的表,所以我只需要搜索以这个数字开头的第一行。

标签: awk

解决方案


EDIT2:在与 OP 聊天后得知,我们需要Input-Output in F Format在 Input_file 中的行匹配后从 Input_file 打印第 5 和第 6 个字段,如下所示。

awk '/Input-Output in F Format/{flag=1;next} flag && ($0 ~ /^[0-9]/ ||  $0 ~ /^ [0-9]+/){printf("%.06f\n%.06f\n",$5,$6)}' Input_file


这是你想要的,不清楚但试一试。这里$(NF-1)表示倒数第二个,$NF表示当前行的最后一个字段。因此,您也可以根据需要更改字段编号。

awk 'FNR>4{printf("%.06f\n%.06f\n",$(NF-1),$NF)}' Input_file

输出如下。

46.397509
0.359374
0.087475
0.000640
......... so on.....

编辑:由于 OP 的 Input_file 可能有 TAB 分隔的数据,因此建议在此处更改awkawk -F'\t'OP。

另外,如果您想在一行中查看列号,则可以运行以下命令。

awk '{for(i=1;i<=NF;i++){print "field_number",i,"field value",$i}}' Input_file

最终解决方案

awk '/^$/{flag=""} /Input-Output in F Format/{flag=1;next} flag && ($0 ~ /^[0-9]/ || $0 ~ /^ [0-9]+/) && ($0 !~ /[2][89]/ && $0 !~ /[3][01]/){printf("%.06f\n%.06f\n",$5,$6)}' Input_file

或者现在添加上述解决方案的非单行形式:

awk '
/^$/{
  flag=""
}
/Input-Output in F Format/{
  flag=1
  next
}
flag && ($0 ~ /^[0-9]/ || $0 ~ /^ [0-9]+/) && ($0 !~ /[2][89]/ && $0 !~ /[3][01]/){
  printf("%.06f\n%.06f\n",$5,$6)
}'   Input_file

推荐阅读