Я хочу 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
Кто-либо знает, как получить второе число одновременно?
Один возможный путь...
% grep 'solver.cpp:229' ExampleFile.txt | cut -d ' ' -f 3,6 | tr -d ','
2000 0.305721
2020 0.294722
Я проиграл 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
С awk указывают разделитель F ield как'', запятая и 'располагает с интервалами' и соответствует тем строкам, которые содержат "Повторение" в, затем печатают столбцы № 3 и № 7 (или $NF как последний столбец вместо 7$)
awk -F'[, ]' '/Iteration/ {print $3,$7}' infile
perl -nE '/\].*?(\d+),.*loss = (\d+\.\d+)/ and say "$1 $2"' infile