2013-12-18 1 views
3

Я пытаюсь разобрать файл, по какой-либо причине, строку «& ($)» в качестве разделителя записей и «(@) $» в качестве разделителя полей. Я не мог получить awk для анализа файла, указав их как RS и FS в блоке BEGIN. Я использую 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

 Смежные вопросы

  • Нет связанных вопросов^_^