Синтаксический анализ входных данных в awk

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

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

<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 ответ

 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 обугливается? Я не думаю, что вы сможете иметь awk Разобрать файл со встроенными нулевыми символами. Вы можете подготовить свой ввод, как

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

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

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

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

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

Другие вопросы по тегам