Awk和美元签到记录分隔符

时间:2013-12-18 19:44:11

标签: awk gawk

我正在尝试解析一个文件,无论出于什么原因,字符串“&($)”作为记录分隔符,“(@)$”作为字段分隔符。我无法通过在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

感谢专家的帮助。

谢谢, ķ

2 个答案:

答案 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