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

mcE*_*nge 6 command-line bash grep text-processing

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
Run Code Online (Sandbox Code Playgroud)

我需要“solver.cpp:229] Iteration”右侧和“, loss =”右侧的数字。我需要同时获得两个数字,这样我的结果文件看起来像这样:

// ResultFile.txt
2000 0.305721
2020 0.294722
Run Code Online (Sandbox Code Playgroud)

我只知道如何使用这样的 grep 获取其中一个数字

grep ", loss = " ExampleFile.txt | sed -e "s/.* //" > ResultFile.txt
Run Code Online (Sandbox Code Playgroud)

有谁知道如何同时获得第二个数字?

fkr*_*iem 8

一种可能的方式...

% grep 'solver.cpp:229' ExampleFile.txt | cut -d ' ' -f 3,6 | tr -d ','
2000 0.305721
2020 0.294722
Run Code Online (Sandbox Code Playgroud)


Zan*_*nna 7

我输了,grep但在这里sed

$ sed -nr 's/.*Iteration ([0-9]+).*loss.*( [0-9]+.*)/\1\2/p' ExampleFile.txt
2000 0.305721
2020 0.294722
Run Code Online (Sandbox Code Playgroud)
  • -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
Run Code Online (Sandbox Code Playgroud)


αғs*_*нιη 5

与AWK指定˚F ield分离器“”逗号和‘空间’并匹配那些含有‘迭代’在线,下一个打印列#3和#7(或$ NF作为最后一列,而不是$ 7)

awk -F'[, ]' '/Iteration/ {print $3,$7}' infile
Run Code Online (Sandbox Code Playgroud)