2017-03-21 157 views
0

我有包含单词“TEMPO”在每行重复多次的文件。 如实施例:搜索单词按行重复多次搜索单词

(TAF HECA 312300Z 0100/0206 32008KT 6000 NSC TEMPO 0100/0107 VRB03KT 4000HZ PROB40 TEMPO 0101/0106 2000BR BECMG 0109/0111 35010KT 9999 SCT025=) 

我想搜索(TEMPO)逐个作出如果条件:

如果小时后第一(TEMPO)> =第一6小时停止,并且如果没有完成阅读和搜索2日(TEMPO)。我的脚本是:

#!/bin/sh 
     cat taf2 | while read line 
    do 
    ihour1=`echo $line |cut -d "Z" -f2 | awk '{ print substr($0,2,4) }'` 
    lhour1=`echo $line |cut -d "Z" -f2 | awk '{ print substr($0,7,4) }'` 
    l6hour1=`expr $ihour1 + 6` 
    printf -v l6hour1 "%04d" $l6hour1 ; echo $l6hour1 
    line2=`echo $line | sed "s:Z ${ihour1}/${lhour1}:Z  ${ihour1}/${l6hour1}:g"` 
    #echo $line2 
    # search for TEMPO 
    ihour2=`echo $line2 |awk '{for (I=1;I<=NF;I++) if ($I == "TEMPO") {val[++c]=substr($(I+1),1,4);{print $(I+1)};}}'|awk '{print substr($0,1,4)}'` 
    lhour2=`echo $line2 |awk '{for (I=1;I<=NF;I++) if ($I == "TEMPO") {print $(I+1)};}'|awk '{print substr($0,6,4)}'` 
    ## 
    count_tempo=`echo $ihour2 |wc -w` 
    for cc in {1..$count_tempo};do 
    echo $ihour2 $val[$cc] 
    if [ $ihour2 -ge $l6hour1 ]; then 
    fline=`echo $line2 | sed "s: TEMPO.*::g"` 
    echo no 
    else 
    fline=`echo $line2| sed "s:TEMPO ${ihour2}/${lhour2}:TEMPO ${ihour2}/${l6hour1}:g"` 
    echo yes 
    fi 
    echo $fline "=" >>ttt 
    done 
    done 
    #### 

我想打一个循环在TEMPO的数量,单独读第一,然后可以去下与否。 感谢您的帮助。

+0

_if - - 等于某个值stop_停止程序执行完毕或者只是继续下一行?无需打印任何东西?如果有的话请发布预期的输出。 –

+0

即使在档案的第二行,您是否希望自己的速度条件继续?或者每行必须被视为单独/独特的情况? –

+0

我希望条件是为每个单独的行 – user3625191

回答

0

首先,试试这个打印所有对应TEMPO小时值 -

awk '{for (I=1;I<=NF;I++) if ($I == "TEMPO") {print substr($(I+1),1,4)}}' f 

如果你想停止TEMPO后搜索特定的小时值后,下面的输入文件 检查和解决方案 -

cat f ###added one more TEMPO with 0110/0111 in last 

TAF HECA 312300Z 0100/0206 32008KT 6000 NSC TEMPO 0100/0107 VRB03KT 4000HZ PROB40 TEMPO 0101/0106 2000BR BECMG 0109/0111 08KT 6000 NSC TEMPO 0110/0111 

目前,我们有三个TEMPO值 -

awk '{for (I=1;I<=NF;I++) if ($I == "TEMPO") {a[$(I+1)]++}} END {for(i in a) print substr(i,1,4)}' f 
0110 
0101 
0100 

现在,如果我想搜索0101之后停止,然后我会用下面 命令 -

awk '{for (I=1;I<=NF;I++) if ($I == "TEMPO") {a[$(I+1)]++}} END {for(i in a) if(substr(i,1,4) != "0101") {print substr(i,1,4)} else {print substr(i,1,4);exit}}' f 
0110 
0101 
0

在GNU AWK (正则表达式FS):

$ awk -F"[ /]" -v certain_value="0100" '   # set FS to " " or "/" 
/TEMPO/{           # all records with TEMPO 
    for(i=1;i<=(NF-1);i++)       # iterate all but last field 
     if($i=="TEMPO" && $(i+1)==certain_value) { # if match 
      print $(i+1)       # output certain_value 
      next         # move to process next record 
     } 
}' file 
0100 

如果TEMPO是每个记录您可以从代码中删除行:

/TEMPO/ { 
}   # basically either will do 
+1

啊,好的。也许(阅读:绝对!)你应该添加所有这些评论到你的问题有很多原因。 –

0

你的错误在我的Debian(GNU awk中4.1.4)没有可重放
而且,你不必管awk到另一个awk - 你可以直接在同一个awk中应用substr。

$ a="(TAF HECA 312300Z 0100/0206 32008KT 6000 NSC TEMPO 0100/0107 VRB03KT 4000HZ PROB40 TEMPO 0101/0106 2000BR BECMG 0109/0111 35010KT 9999 SCT025=)" 
$ awk '{for (I=1;I<=NF;I++) if ($I == "TEMPO") {val[++c]=substr($(I+1),1,4);print val[c]}}' <<<"$a" 
0100 
0101 

在上面的测试中,我将TEMPO的值存储在数组val中。 val[1]将具有所述第一发现值TEMPO,val[2]将保持第二发现速度值等

然后可以循环通过该阵列(即长度(VAL)返回val数组的长度(元素的数量)),你可以建立自己的状态检查。

+0

我试图做到这一点,但是当我试图做一个循环时,我想我写错了方式。当我在问题中执行脚本时,错误是:第17行:[:太多参数 sed:-e表达式#1,字符12:未终止的's'命令 – user3625191