簡體   English   中英

如何在AWK中使用正則表達式匹配ASTERISK

[英]How to use regex to match ASTERISK in awk

我對正則表達式還很陌生,並且剛剛開始學習使用awk。 我要完成的工作是編寫一個ksh腳本,以讀取文本中的行,以及與以下各行匹配的行:

*記錄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然后寫整行是執行此操作的正確方法。 因此,我需要一些嚴肅的啟示。

所以您希望示例行看起來像

*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

使用平等。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM