2013-12-18 81 views
3

我試圖解析一個文件,該文件不管出於何種原因都將字符串「&($)」作爲記錄分隔符並將「(@)$」作爲字段分隔符。我無法通過在BEGIN塊中將這些文件指定爲RS和FS來解析文件。我正在使用gnu awk 3.1.7,它抱怨說有一個語法錯誤,但無法找到如何逃離美元符號(假設這是它不喜歡的)。Awk和美元符號記錄分隔符

$ awk 'BEGIN{FS="(@)$" RS="&($)"} {} END{print NR}' some-file.txt 
awk: BEGIN{FS="(@)$" RS="&($)"} {} END{print NR} 
awk:     ^syntax error 

感謝專家的幫助。

感謝, ķ

回答

6

你需要在正則表達式中有特殊含義的字符轉義。

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

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

請注意,雖然未明確提及,但在此答案中添加了必要的';'。 – chepner

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 
+1

我不認爲這是解析OP描述的文件。 – Kent

+0

是的,你是對的。我專注於FS/RS聲明,然後檢查其餘部分。 – fedorqui

+1

感謝您指出這一點。我曾嘗試過這一點,但忘了在問題中加入。 – KumarM