我有大量数据,我想根据两个条件提取两种类型的数据。我写了一个tcl脚本来使用正则表达式(newbie to regex)提取数据。
我使用了以下条件,它可以正常工作并产生所需输出的一部分:
if [regexp {\+ ([0-9.]+) 1 2.*- } $line -> time ] {
我在脚本中的某个地方使用变量时间。上述条件产生以下o / p(这只是一个样本,因为文件很大):
+ 30.808352 1 2 tcp 40 ------- 30 6.7 2.30 81 2073
+ 30.808416 1 2 tcp 40 ------- 128 8.16 2.159 81 2069
+ 30.809513 1 2 tcp 40 ------- 156 12.19 2.187 1 2077
+ 30.809641 1 2 tcp 80 ------- 156 12.19 2.187 1 2078
+ 30.809878 1 2 tcp 40 ------- 151 7.18 2.182 41 2079
+ 30.813096 1 2 tcp 40 ------- 161 9.20 2.192 0 2083
+ 30.813352 1 2 tcp 40 ------- 157 13.19 2.188 1 2085
+ 30.81348 1 2 tcp 80 ------- 157 13.19 2.188 1 2086
+ 30.815362 1 2 tcp 40 ------- 148 12.18 2.179 41 2088
+ 30.815426 1 2 tcp 40 ------- 148 5.9 2.179 41 2089
+ 30.818096 1 2 tcp 40 ------- 162 10.20 2.193 0 2091
+ 30.818544 1 2 tcp 40 ------- 158 3.78 2.189 1 2093
+ 30.818672 1 2 tcp 80 ------- 158 14.19 2.189 1 2094
+ 30.820657 1 2 tcp 40 ------- 153 9.19 2.184 41 2096
+ 30.821579 1 2 tcp 40 ------- 154 10.19 2.185 41 2097
然后,在上面的if条件中,我想检查第9列:
//condition 1
if (9th between [3-6].*) ( such as 3.78,6.7, 5.9)
第二个条件是:
//condition 2
if (9th between [7-14].*) ( such as 14.19,12.18,10.19, 9.19,.....)
我正在努力解决上述两个问题。我尝试了以下内容,但没有收到错误,但是没有发生匹配!!
condition 1:
if [regexp {\+ ([0-9.]+) 1 2.*-* ([3-9])\..*/ } $line ] {
我知道我正在重复主要if条件的一部分,因为我不知道如何跳过列!!!
condition 2:
if [regexp {\+ ([0-9.]+) 1 2.*-* ([7-9]|1[0-4])\..*/} $line ] {
任何建议!!!
答案 0 :(得分:2)
你为什么不分裂空间?使用更多行可以获得几乎相同的结果。它是可读的,人们可以更好地理解代码:
if [regexp {\+ ([0-9.]+) 1 2.*- } $line -> time] {
set elements [split $line " "] ;# You can actually omit the " " in this case
set 9th [lindex $elements 8]
# Condition 1
if {$9th >= 3 && $9th < 7} { do something }
# Condition 2
if {$9th >= 7 && $9th < 15} { do something }
}
答案 1 :(得分:0)