2014-01-29 58 views
2

我想了解awk中的一些命令,這些命令與If statement inside awk to change a value問題有關。[a-z] +,[A-Z] +,[0-9] +和awk中的標誌命令

輸入文件是

... 
MODE P E 
IMP:P 1 19r 0 
IMP:E 1 19r 0 
... 
SDEF POS= 0 0 14.6 AXS= 0 0 1 EXT=d3 RAD= d4 cell=23 ERG=d1 PAR=2 
SI1 L 0.020 
SP1 1 
SI4 0. 3.401                  
SI3 0.9 
... 
NPS 20000000 

而且代碼

#! /bin/bash 

vals=(0.02 0.04) 

for val in "${vals[@]}"; do 
awk -v val="$val" ' 
    BEGIN { i=1; split (val,v," ") } 
    # If it is a string, find the sequence SI1 L and change the value after that, using values that the user inputs 
    /SDEF POS.*ERG=[a-zA-Z]+/ { flag="y" ; } 
    /SI1 L/ { if (flag=="y") { $3=v[i]; i++; flag="n"; } } 
    # If it is a number, change the number using values that the user inputs. 
    /SDEF POS.*ERG=[0-9]+/{ sub(/ERG=[0-9]*/, "ERG="v[i],$0);i++; } 
    1 
' 20small > "${val}" 
done 

我想ubderstand以下

  1. 後爲什麼[a-z][A-Z][0-9]存在+標誌?我可以理解,這些命令在定義的序列後搜索任何字母和數字,但我似乎無法理解+做什麼。
  2. flag究竟做了什麼?我可以理解/<expresion>/ flag="y"y「替代」<expresion>。我似乎無法理解改變國旗幾行下面的原因。這是否就像一面虛擬旗幟?
  3. / /究竟做了什麼?我知道這聲明瞭搜索模式。爲什麼加入SDEFPOS?只是爲了確定這是正確的路線?我也發現混淆了.*的使用。是不是意味着找不到SDEF POS一行,並且在同一行尋找ERG,不管它們之間是什麼/SDEF POS.*ERG=[a-zA-z]+/究竟做了什麼?

我是awk的新手,所以我想通過示例來了解它。幫助將更多,歡迎!

回答

3
  1. +表示一次或多次重複。例如,a+將匹配aaaaaaa*匹配相同+,也沒有a

  2. 標誌被用作臨時信息保持器。

  3. / /是正則表達式架和用來表明它必須正則表達式兩個/

內符合我建議你看一些awk一個襯墊,並嘗試瞭解他們的工作。另請閱讀awk教程。您可以通過使用Google找到很多。

+0

非常感謝您的回答!雖然有更多問題。爲什麼要添加新標誌,即「flag =」n「'?這是一個無用的信息,不是嗎?另外'''做什麼?例如'/ SDEF POS。* ERG = [a-zA-Z] +'是做什麼的? – Thanos

+0

'.'表示任何字符。標誌從'y'(是)改變爲'n'(否),告訴它完成一些操作,以防止重複。我喜歡帶'0'或'1'的標誌,但任何事情都可以。 '/ SDEF POS。* ERG = [0-9] + /'產生一個以'SDEF POS'開始的文本,然後是一些或多個未知的字符'。*'然後'ERG ='然後一個或多個數字'[0-9 ] +'。 Eks它會匹配這條線'DATA SDEF POSME TOERG = 3445356' – Jotne

+0

我明白了!這意味着是或否......現在它使4s完美的感覺!非常感謝你!!! – Thanos

相關問題