2017-03-21 205 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