2013-12-18 3 views
3

어떤 이유로 든 레코드 구분 기호로 "& ($)"문자열이 있고 필드 구분 기호로 "(@) $"문자열을 가진 파일을 구문 분석하려고합니다. BEGIN 블록에서 RS와 FS로 지정하여 awk에 파일을 구문 분석 할 수 없습니다. 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 

전문가의 도움을 감사하십시오.

감사합니다, K

답변

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