Как grep два номера из одной строки в разных местах с помощью bash?

Я хочу grep 2 числа из той же строки в примере ниже:

// ExampleFile.txt
solver.cpp:229] Iteration 2000, loss = 0.305721
solver.cpp:245]     Train net output #0: accuracy = 0.926112
solver.cpp:245]     Train net output #1: accuracy = 0.723957
solver.cpp:245]     Train net output #2: accuracy = 0.599623
sgd_solver.cpp:106] Iteration 2000, lr = 0.000227383
solver.cpp:229] Iteration 2020, loss = 0.294722
solver.cpp:245]     Train net output #0: accuracy = 0.855208
solver.cpp:245]     Train net output #1: accuracy = 0.71616
solver.cpp:245]     Train net output #2: accuracy = 0.619429

Мне нужно число справа от "solver.cpp: 229] Итерация" и к право ", loss =". Мне нужно получить оба числа в одно и то же время, чтобы мой итоговый файл выглядел следующим образом:

// ResultFile.txt
2000 0.305721
2020 0.294722

Я знаю только, как получить одно из чисел, используя grep, как это

grep ", loss = " ExampleFile.txt | sed -e "s/.* //" > ResultFile.txt

Кто-нибудь знает, как получить второе число одновременно?

1
задан 8 November 2016 в 15:56

3 ответа

Я потерял grep, но здесь он с sed

$ sed -nr 's/.*Iteration ([0-9]+).*loss.*( [0-9]+.*)/\1\2/p' ExampleFile.txt
2000 0.305721
2020 0.294722
-n не печатает, пока мы не попросим что-нибудь -r использовать ERE, поэтому мне не нужно избежать () и + метасимволов s искать и заменять /old/new/ .* соответствует любым (или нет) символам ([0-9]+) круглых скобок, чтобы сохранить эту часть шаблона [0-9] числом + одним или больше появления предыдущего символа. \1\2 обратные ссылки на шаблоны, сохраненные ранее с круглыми скобками p, печатают биты, которые мы хотим видеть

Если вы хотите получить результат, перенаправьте его в ваш файл:

sed -nr 's/.*Iteration ([0-9]+).*loss.*( [0-9]+.*)/\1\2/p' ExampleFile.txt > ResultFile.txt
8
ответ дан 23 May 2018 в 04:25

С awk укажите разделитель полей как «,» и «пробел» и сопоставьте те строки, которые содержат «Итерацию», затем напечатайте столбцы №3 и №7 (или $ NF как последний столбец вместо $ 7)

awk -F'[, ]' '/Iteration/ {print $3,$7}' infile
5
ответ дан 23 May 2018 в 04:25
perl -nE '/\].*?(\d+),.*loss = (\d+\.\d+)/ and say "$1 $2"' infile
, если (строка соответствует регулярному выражению), напечатайте соответствующие группы.
1
ответ дан 23 May 2018 в 04:25

Другие вопросы по тегам:

Похожие вопросы: