Awk和美元登录记录分隔符

Awk和美元登录记录分隔符,awk,gawk,Awk,Gawk,我试图解析一个文件,无论出于何种原因,该文件将字符串“&($)”作为记录分隔符,“(@)$”作为字段分隔符。我无法通过在BEGIN块中将它们指定为RS和FS来让awk解析文件。我正在使用GNUAWK3.1.7,它抱怨说有语法错误,但找不到如何避开美元符号(假设它不喜欢美元符号) 感谢专家们的帮助 谢谢, K在开始{}块中定义两个值时,缺少一个分号来分隔它们: awk 'BEGIN{FS="(@)$"; RS="&($)"} {} END{print NR}' file

我试图解析一个文件,无论出于何种原因,该文件将字符串“&($)”作为记录分隔符,“(@)$”作为字段分隔符。我无法通过在BEGIN块中将它们指定为RS和FS来让awk解析文件。我正在使用GNUAWK3.1.7,它抱怨说有语法错误,但找不到如何避开美元符号(假设它不喜欢美元符号)

感谢专家们的帮助

谢谢,
K

开始{}
块中定义两个值时,缺少一个分号来分隔它们:

awk 'BEGIN{FS="(@)$"; RS="&($)"} {} END{print NR}' file
                    ^
你也可以

awk 'BEGIN{FS="(@)$"} {} END{print NR}' RS="&($)" file

关于这些分隔符的使用,请注意:您需要避开它们

$ cat a
hello(@)$this(@)$is one record&($)and this another one
$ awk 'BEGIN{FS="\\(\\@\\)\\$"} {print $1, NR, NF}' RS="\\&\\(\\$\\)" a
hello 1 3
and this another one
 2 1

你需要摆脱那些在正则表达式中有特殊意义的字符

kent$  cat f                                               
foo(@)$bar(@)$blah&($)foo2(@)$bar2(@)$blah2

kent$  awk 'BEGIN{FS="\\(@\\)\\$";RS="&\\(\\$\\)"}{print NR,NF}' f
1 3
2 3

我认为这不会像OP描述的那样解析文件。是的,你是对的。我关注了FS/RS声明,然后检查了其余部分。感谢您指出这一点。我试过了,但忘了把它包括在问题中,但未明确提及。
kent$  cat f                                               
foo(@)$bar(@)$blah&($)foo2(@)$bar2(@)$blah2

kent$  awk 'BEGIN{FS="\\(@\\)\\$";RS="&\\(\\$\\)"}{print NR,NF}' f
1 3
2 3