Home > Enterprise >  Recording particular cell of a table on the basis of a certain condition using grep
Recording particular cell of a table on the basis of a certain condition using grep

Time:10-12

I have a number of tables that looks as follows:

 time | node  | left  |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr|  dualbound   | primalbound  |  gap   | compl. 
  0.0s|     1 |     0 |   100 |     - |  1046k |   0 | 100 | 102 | 100 |   0 |  0 |   0 |   0 |      --      | 9.999990e 05*|    Inf | unknown
* 0.3s|     1 |     0 |   100 |     - |    LP  |   0 | 200 | 102 | 100 |   0 |  0 |   0 |   0 |      --      | 5.587300e 04 |    Inf | unknown
 12.0s|     1 |     0 |   239 |     - |  1781k |   0 | 239 | 102 | 100 |   0 |  0 |   0 |   0 | 5.577800e 04 | 5.587300e 04 |   0.17%| unknown
 12.1s|     1 |     0 |   287 |     - |  2595k |   0 | 239 | 102 | 935 | 835 |  1 |   0 |   0 | 5.577800e 04 | 5.587300e 04 |   0.17%| unknown
 66.8s|     1 |     0 |   422 |     - |  3061k |   0 | 336 | 102 | 935 | 835 |  1 |   0 |   0 | 5.577800e 04 | 5.587300e 04 |   0.17%| unknown
 89.4s|     1 |     0 |   481 |     - |  3218k |   0 | 361 | 102 | 935 | 835 |  1 |   0 |   0 | 5.580100e 04 | 5.587300e 04 |   0.13%| unknown
 89.5s|     1 |     0 |   579 |     - |  3513k |   0 | 361 | 102 |1335 |1235 |  2 |   0 |   0 | 5.580100e 04 | 5.587300e 04 |   0.13%| unknown
  100s|     1 |     0 |   715 |     - |  3837k |   0 | 403 | 102 |1335 |1235 |  2 |   0 |   0 | 5.583250e 04 | 5.587300e 04 |   0.07%| unknown

I'm interested in recording the first numeric value in the gap column (second last column of the table). The gap column could either have Inf or x.xx% values in it. If all the values in the gap column are Inf, then I would simply record Inf, otherwise, I would like to record the first numeric value. For e.g. in the above table, the value that I would like to record is 0.17. I tried many different ways but couldn't achieve any success. It would be really great if someone could provide some guidance as to how to achieve the above-mentioned objective. Thanks !

CodePudding user response:

You may use this awk solution:

awk -F '[[:blank:]]*\\|[[:blank:]]*' '
NR > 1 && (!v || v == "Inf") {
   v = ($(NF-1) == "Inf" ? $(NF-1) : $(NF-1) 0)
}
END {
   print v
}' file

0.17
  • Related