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

Я хочу 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

Мне нужно число направо от "решателя cpp:229] Повторение "и направо от", потеря =". Я должен получить оба числа, одновременно таким образом, что мой получающийся файл похож на это:

// ResultFile.txt
2000 0.305721
2020 0.294722

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

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

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

6
задан 8 November 2016 в 04:56

4 ответа

Один возможный путь...

% grep 'solver.cpp:229' ExampleFile.txt | cut -d ' ' -f 3,6 | tr -d ','
2000 0.305721
2020 0.294722
8
ответ дан 23 November 2019 в 07:16

Я проиграл grep, но здесь это с sed

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

, Если вывод - то, что Вы хотите, перенаправляете его к своему outfile:

sed -nr 's/.*Iteration ([0-9]+).*loss.*( [0-9]+.*)/\1\2/p' ExampleFile.txt > ResultFile.txt
7
ответ дан 23 November 2019 в 07:16

С awk указывают разделитель F ield как'', запятая и 'располагает с интервалами' и соответствует тем строкам, которые содержат "Повторение" в, затем печатают столбцы № 3 и № 7 (или $NF как последний столбец вместо 7$)

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

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

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