[英]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.