Синтаксический анализ входных данных в awk - PullRequest
5 голосов
/ 02 августа 2011

видел много постов, задающих аналогичный вопрос. Не могу заставить его работать.

Ввод выглядит как:

<field one with spaces>|<field two with spaces>

Попытка разобрать с awk.

Перепробовал много вариантов из отличных постов:

FS = "^[\x00- ]*|[\x00- ]*[|][\x00- ]*|[\x00- ]*$";
FS = "^[\x00- ]*|[\x00- ]*\|[\x00- ]*|[\x00- ]*$";
FS = "^[\x00- ]*|[\x00- ]*\\|[\x00- ]*|[\x00- ]*$";

Все еще не удается заставить работать разделитель труб.

Использование CentOS.

Любая помощь?

1 Ответ

15 голосов
/ 03 августа 2011
 echo "field one has spaces | field two has spaces" \
 | awk '
   BEGIN {
      FS="|" 
 }
 {
   print $2
   print $1
   # or what ever you want
 }'

 #output

  field two has spaces
  field one has spaces

Вы также можете уменьшить это до

awk -F'|' {
    print $2
    print $1
}'

Редактировать Кроме того, не все awks могут принимать многосимвольное регулярное выражение для значения FS.

Edit2 Каким-то образом я пропустил это изначально, но вижу, что вы пытаетесь включить \x00 в классы char до и после символа |. Я полагаю, вы имеете в виду для \x00 == null char? Я не думаю, что вы сможете awk проанализировать файл со встроенными нулевыми символами. Вы можете подготовить свой ввод как

 tr '\x00'   ' ' < file.txt > spacesForNulls.txt 

ИЛИ удалить их вместе с

tr -d '\x00' < file.txt > deletedNulls.txt

и уберите эту часть вашего регулярного выражения. Но, как указано выше, некоторые awk не поддерживают регулярное выражение для значения FS. И я не очень часто использую трюк tr, вы можете обнаружить, что для символа null требуется немного другое обозначение, в зависимости от вашей версии tr.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...