我正在尝试解析一个文件,无论出于什么原因,字符串“&($)”作为记录分隔符,“(@)$”作为字段分隔符。我无法通过在BEGIN块中将这些指定为RS和FS来解析文件。我正在使用gnu awk 3.1.7并且它抱怨说有语法错误但无法找到如何逃避美元符号(假设它不喜欢)。
$ awk 'BEGIN{FS="(@)$" RS="&($)"} {} END{print NR}' some-file.txt
awk: BEGIN{FS="(@)$" RS="&($)"} {} END{print NR}
awk: ^ syntax error
感谢专家的帮助。
谢谢, ķ
答案 0 :(得分:6)
你需要逃避那些在正则表达式中具有特殊意义的字符。
kent$ cat f
foo(@)$bar(@)$blah&($)foo2(@)$bar2(@)$blah2
kent$ awk 'BEGIN{FS="\\(@\\)\\$";RS="&\\(\\$\\)"}{print NR,NF}' f
1 3
2 3
答案 1 :(得分:4)
当您在BEGIN{}
块中定义两个值时,您缺少一个分号来分隔它们:
awk 'BEGIN{FS="(@)$"; RS="&($)"} {} END{print NR}' file
^
您也可以
awk 'BEGIN{FS="(@)$"} {} END{print NR}' RS="&($)" file
关于这些分隔符的使用,请注意Kent is commenting in his answer:你需要逃避它们。
$ 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