#shell #scripting #grep
Вопрос:
У меня есть несколько таблиц, которые выглядят следующим образом:
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
Меня интересует запись первого числового значения в столбце пробел (второй последний столбец таблицы). Столбец пробел может содержать либо Inf
значения, либо x.xx%
значения. Если все значения в столбце пробел Inf
, то я бы просто записал Inf
, в противном случае я хотел бы записать первое числовое значение. Например, в приведенной выше таблице значение, которое я хотел бы записать, равно 0.17
. Я пробовал много разных способов, но не смог добиться никакого успеха. Было бы действительно здорово, если бы кто-нибудь мог дать некоторые рекомендации относительно того, как достичь вышеупомянутой цели. Спасибо!
Ответ №1:
Вы можете использовать это решение awk:
awk -F '[[:blank:]]*\|[[:blank:]]*' ' NR > 1 amp;amp; (!v || v == "Inf") { v = ($(NF-1) == "Inf" ? $(NF-1) : $(NF-1) 0) } END { print v }' file 0.17