Синтаксический анализ входных данных в 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
,
Надеюсь, это поможет.