匹配正则表达式中第 n 列的十进制数
Match decimal numbers from nth column in regex
我需要在 Perl 代码中将列与 P&L 匹配。它的往返利润百分比。可以是消极的或积极的。数字可以是 -5.12 或 1005.12。
2018-03-15 16:38:28 (DEBUG): current trend duration: 6
2018-03-15 16:38:28 (INFO):
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) REPORT:
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) entry date (UTC) exit date (UTC) exposed duration P&L profit
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-10 14:00 2018-03-10 15:10 an hour -0.00 -0.01
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-10 17:50 2018-03-10 23:00 5 hours -0.30 -7.72
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-11 02:10 2018-03-11 03:30 an hour 120.06 1.58
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-12 15:40 2018-03-12 22:00 6 hours -0.15 -4.05
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-13 09:10 2018-03-13 10:10 an hour 0.00 0.13
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-13 12:20 2018-03-13 13:30 an hour -120.01 -0.36
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-13 21:00 2018-03-13 22:20 an hour 0.06 1.75
2018-03-15 16:38:28 (INFO):
2018-03-15 16:38:28 (INFO): (PROFIT REPORT) start time: 2018-03-10 00:00:00
例如匹配是:
-0.00
-0.30
120.06
-0.15
0.00
-120.01
0.06
如何使用 PCRE 正则表达式?
试试这个 perl 正则表达式:
ROUNDTRIP\)\s+\d{4}-\d{2}-\d{2}.*?\K-?\d+\.\d+
$ grep -oP 'ROUNDTRIP\)\s+\d{4}-\d{2}-\d{2}.*?\K-?\d+\.\d+' file
-0.00
-0.30
120.06
-0.15
0.00
-120.01
0.06
使用 awk
无需任何正则表达式即可轻松完成 :
awk 'NF>10 && +0 == {print }' file
-0.00
-0.30
120.06
-0.15
0.00
-120.01
0.06
详情:
- 条件
NF>10 && +0 ==
检查一行中是否有超过 10 个字段,并确保第 11 个字段是数字
{print }
打印每条记录的第 11 个字段
如果您正在寻找 perl
脚本那么这里是等效的 perl
命令:
perl -alne 'print $F[11] if $F[11] =~ /^-?\d*\.?\d+$/' file
-0.01
-7.72
1.58
-4.05
0.13
-0.36
1.75
perl代码:
#!/usr/bin/perl
use strict;
use warnings;
my @words;
while(<>) {
@words = split(" ");
if (scalar @words > 10 && $words[11] =~ /^-?\d*\.?\d+$/) {
print $words[11] . "\n";
}
}
我需要在 Perl 代码中将列与 P&L 匹配。它的往返利润百分比。可以是消极的或积极的。数字可以是 -5.12 或 1005.12。
2018-03-15 16:38:28 (DEBUG): current trend duration: 6
2018-03-15 16:38:28 (INFO):
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) REPORT:
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) entry date (UTC) exit date (UTC) exposed duration P&L profit
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-10 14:00 2018-03-10 15:10 an hour -0.00 -0.01
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-10 17:50 2018-03-10 23:00 5 hours -0.30 -7.72
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-11 02:10 2018-03-11 03:30 an hour 120.06 1.58
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-12 15:40 2018-03-12 22:00 6 hours -0.15 -4.05
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-13 09:10 2018-03-13 10:10 an hour 0.00 0.13
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-13 12:20 2018-03-13 13:30 an hour -120.01 -0.36
2018-03-15 16:38:28 (INFO): (ROUNDTRIP) 2018-03-13 21:00 2018-03-13 22:20 an hour 0.06 1.75
2018-03-15 16:38:28 (INFO):
2018-03-15 16:38:28 (INFO): (PROFIT REPORT) start time: 2018-03-10 00:00:00
例如匹配是:
-0.00
-0.30
120.06
-0.15
0.00
-120.01
0.06
如何使用 PCRE 正则表达式?
试试这个 perl 正则表达式:
ROUNDTRIP\)\s+\d{4}-\d{2}-\d{2}.*?\K-?\d+\.\d+
$ grep -oP 'ROUNDTRIP\)\s+\d{4}-\d{2}-\d{2}.*?\K-?\d+\.\d+' file
-0.00
-0.30
120.06
-0.15
0.00
-120.01
0.06
使用 awk
无需任何正则表达式即可轻松完成 :
awk 'NF>10 && +0 == {print }' file
-0.00
-0.30
120.06
-0.15
0.00
-120.01
0.06
详情:
- 条件
NF>10 && +0 ==
检查一行中是否有超过 10 个字段,并确保第 11 个字段是数字 {print }
打印每条记录的第 11 个字段
如果您正在寻找 perl
脚本那么这里是等效的 perl
命令:
perl -alne 'print $F[11] if $F[11] =~ /^-?\d*\.?\d+$/' file
-0.01
-7.72
1.58
-4.05
0.13
-0.36
1.75
perl代码:
#!/usr/bin/perl
use strict;
use warnings;
my @words;
while(<>) {
@words = split(" ");
if (scalar @words > 10 && $words[11] =~ /^-?\d*\.?\d+$/) {
print $words[11] . "\n";
}
}