如何使用 bash 从同一行不同位置 grep 两个数字?

如何使用 bash 从同一行不同位置 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

我需要“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
  • 如果(行与正则表达式匹配),则打印相关组。

相关内容