以下の例の同じ行から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番目の数字を同時に取得する方法を知っていますか?
1つの可能な方法...
% 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
は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
AwkでF ield separatorを '、'カンマおよび 'space'として指定し、 "Iteration"を含む行に一致して、次に列#3および#7(または最後に$ NFを出力) 7ドルではなく列)
awk -F'[, ]' '/Iteration/ {print $3,$7}' infile
Perl -nE '/\].*?(\d+),.*loss = (\d+\.\d+)/ and say "$1 $2"' infile