パターンに一致するログファイルで数字を見つける方法

パターンに一致するログファイルで数字を見つける方法

以下を含むログファイルからいくつかの情報を抽出したいと思います。

...
Running ep. 0
...
...
Initial position for this ep is 7.338690864048985,28.51815509409351,11.795143979909135
...
...
...
Running ep. 1
...
...
Initial position for this ep is 10.599326804010953,7.514871863851674,14.843070346933654
...
...

これで、いくつかのデータを抽出できるbashコードができました。

cat screen2.dat|grep -oP 'Running ep. \K([0-9]+)|(?<=for this ep is )[+-]?[0-9]+([.][0-9]+)?'|paste -d' ' - -

ただし、出力は「Running ep」以降の数字にすぎません。 「このepの初期位置は」の後の最初の数字です。

0 7.338690864048985 
1 10.599326804010953 
.
.
.

次のようなことを期待していた

0 7.338690864048985 28.51815509409351 11.795143979909135
1 10.599326804010953 7.514871863851674 14.843070346933654
.
.
.

ベストアンサー1

表現をあまりに過度に指定しているようですね。 substringの後には単一のfloatのみが一致しますfor this ep is 。残りの行が必要な場合は、次のようなものを使用してください

grep -oP 'Running ep\. \K(.*)|for this ep is \K(.*)' screen2.dat |
paste -d ' ' - -

標準を使用してsed以下を作成できます。

sed -n -e 's/^Running ep\. //p' -e 's/.*for this ep is //p' screen2.dat |
paste -d ' ' - -

線の不要な部分を切り取ります(削除する項目がないものと交換)。

awk同じ方法で使用しても良いし、

awk '/^Running ep\. / || /for this ep is / { print $NF }' screen2.dat |
paste -d ' ' - -

または一度にすべてをフォーマットし、

awk '/^Running ep\. / { ep = $NF } /for this ep is / { print ep, $NF }' screen2.dat

おすすめ記事