web-dev-qa-db-ja.com

bashを使用して異なる場所で同じ行から2つの数字を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を使用して数字の1つを取得する方法しか知りません

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

誰かが2番目の数字を同時に取得する方法を知っていますか?

6
mcExchange

1つの可能な方法...

% grep 'solver.cpp:229' ExampleFile.txt | cut -d ' ' -f 3,6 | tr -d ','
2000 0.305721
2020 0.294722
8
fkraiem

私は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回以上の出現。
  • \1\2括弧で以前に保存されたパターンへの後方参照
  • p表示したいビットを出力します

出力が必要なものである場合は、出力ファイルにリダイレクトします。

sed -nr 's/.*Iteration ([0-9]+).*loss.*( [0-9]+.*)/\1\2/p' ExampleFile.txt > ResultFile.txt
7
Zanna

AwkでF ield separatorを '、'カンマおよび 'space'として指定し、 "Iteration"を含む行に一致して、次に列#3および#7(または最後に$ NFを出力) 7ドルではなく列)

awk -F'[, ]' '/Iteration/ {print $3,$7}' infile
5
αғsнιη
Perl -nE '/\].*?(\d+),.*loss = (\d+\.\d+)/ and say "$1 $2"' infile
  • (行が正規表現に一致する場合)関連するグループを出力します。
1
user216043