我想要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] Iteration”右侧的数字和“loss =”右侧的数字。我需要同时获取这两个数字,以便我生成的文件如下所示:
// ResultFile.txt
2000 0.305721
2020 0.294722
我只知道如何使用 grep 获取其中一个数字,如下所示
grep ", loss = " ExampleFile.txt | sed -e "s/.* //" > ResultFile.txt
有人知道如何同时获取第二个数字吗?
答案1
一种可能的方法是...
% grep 'solver.cpp:229' ExampleFile.txt | cut -d ' ' -f 3,6 | tr -d ','
2000 0.305721
2020 0.294722
答案2
我输了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
答案3
使用 awk 指定F字段分隔符为“,”逗号和“空格”,并匹配包含“Iteration”的行,接下来打印列 #3 和 #7(或 $NF 作为最后一列而不是 $7)
awk -F'[, ]' '/Iteration/ {print $3,$7}' infile
答案4
perl -nE '/\].*?(\d+),.*loss = (\d+\.\d+)/ and say "$1 $2"' infile
- 如果(行与正则表达式匹配),则打印相关组。