2010-04-29 115 views
0

我很喜歡正則表達式,剛開始學習使用awk。我試圖做到的是寫一個KSH腳本來讀取時間從文本行,並符合下列條件的每行:如何在awk中使用正則表達式來匹配ASTERISK

* RECORD 0000001 [some_serial_#]

來替換$ 2(即000001 )用不同的數字。所以本質上腳本讀取批處理記錄轉儲,並用date + record#替換記錄號,並寫入單獨的文件。

所以這就是我所想的格式應該是:

awk 'match($0,"/*RECORD")!=0{$2="$DATE-n++"; print $0} match($0,"/*RECORD")==0{print $0}' $BATCH > $OUTPUT 

但顯然「/ * RECORD」是行不通的,我不知道,如果更改$ 2,然後寫全線是做到這一點的正確方法。所以我需要一些認真的啓發。

+0

「FTR」從哪裏來?字面上你想要「$ DATE」還是要替換日期?是「n ++」字面量還是你想增加一個變量? – 2010-04-29 15:43:52

+0

對不起。我現在編輯了原文。該代碼原本是用於另一個腳本,我忘記更改VAR。 $ DATE是一個我將在腳本中定義的變量,而n ++只是增量變量var,從我在前面定義的腳本開始,在此處省略。 – 2010-04-29 17:14:25

回答

1

所以,你想你的榜樣線看起來像

*RECORD $DATE-n++ [some_serial_#] 

awk的用它做之後?

awk '{ if (match($0, "*RECORD") != 0) { $2="$DATE-n++"; }; print }' $BATCH > $OUTPUT 

根據您的更新,它看起來像你,而不是指望$DATE是這是在AWK表達式中使用和n是在awk腳本一個變量,保存了多少條記錄計數的環境變量匹配模式。鑑於此,這可能看起來更像你想要的。

$ cat script.awk 
BEGIN { n=0 } 
{ 
    if (match($0, "\*RECORD") != 0) { 
     n++; 
     $2 = (ENVIRON["DATE"] "-" n); 
    } 
    print; 
} 

$ awk -f script.awk $BATCH > $OUTPUT 
+0

我一定得不到它的正確...我得到這個erroutput 「awk:0602-521有一個正則表達式錯誤./n ?* +之前沒有有效表達式./n /n 源行號是1./n 錯誤上下文是/ n {if(match($ 0,>>>「* FTR」)<< 2010-04-29 17:19:54

+0

然後你的awk需要'*'被轉義 - '匹配($ 0「\\ * RECORD」)'。我的觀點正好相反,併發出警告,說我不必要地逃避了'*'。 – jamessan 2010-04-29 17:40:59

+0

無論我怎麼嘗試,我都搞不清楚:錯誤的上下文是{if(match($ 0,>>>「\ * RECORD」)<<< – 2010-05-03 13:37:45

0

使用相等。

D=$(date +%Y%m%d) 
awk -vdate="$D" ' 
{ 
    for(i=1;i<=NF;i++){ 
    if ($i == "*RECORD"){ 
     $(i+1) = date"00002" 
     break # break after searching for one record, otherwise, remove break 
    } 
    } 
}1' file 
+0

感謝您的建議,經過我自己的一些調整後,我終於做到了我所需要的! – 2010-05-03 14:00:19