我对正则表达式很新,只是开始学习使用awk。我想要完成的是编写一个ksh脚本来读取文本中的读取行,以及符合以下内容的每一行:
* 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 :(得分: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
答案 1 :(得分: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