непечатный символ не распознается как разделитель полей - PullRequest
0 голосов
/ 11 января 2019

У меня есть файл. Его разделитель полей - непечатаемый символ \x1c (chr(28) в Python). В VI это выглядит как a^\b^\c, но с использованием cat я просто вижу abc. Разделитель полей ^\ не виден.

У меня есть простая команда awk:

awk -F $’\x1c’ ‘{print NF}’ a

чтобы получить общее количество полей. Он работает в MacOS, но в AIX не работает. Кажется, AIX не может распознать разделитель полей. Таким образом, вывод 1 означает, что вся строка считается одним полем. Как это сделать в AIX? Любая идея высоко ценится.

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Мне удалось воспроизвести это на SOLARIS с запущенным ksh.

sol bash $ printf '\034a\034b\034c' | cat -v
^\a^\b^\c$
sol bash $ printf '\034a\034b\034c' | awk -F$'\x1c' '{print NF}'
4
sol bash $ printf '\034a\034b\034c' | awk -F$'\034' '{print NF}'
4

sol ksh $ printf '\034a\034b\034c' | cat -v
^\a^\b^\c$
sol ksh $ printf '\034a\034b\034c' | awk -F$'\x1c' '{print NF}'
1
sol ksh $ printf '\034a\034b\034c' | awk -F$'\034' '{print NF}'
1

Я не могу подтвердить, является ли это проблемой ksh или awk, поскольку в обоих случаях происходит сбой.

sol ksh/bash $ printf '\034a\034b\034c' | awk 'BEGIN{FS="\034"}{print NF}'
1

Все вышеперечисленные случаи успешно работают в любой системе Linux (которая запускается по умолчанию GNU awk), но, похоже, она великолепно провалилась.

Следующий трюк - это обходной путь, который вообще не может выйти из строя (до того момента, пока он не выйдет из строя):

sol ksh/bash $ printf '\034a\034b\034c' | awk 'BEGIN{FS=sprintf("%c",28)}{print NF}'
4

Вышеприведенное работает, потому что мы позволяем awk установить FS, используя функцию sprintf, где мы передаем десятичное число 28=x1c=034

0 голосов
/ 11 января 2019

Ну $'\x1c' - это башизм, , переносимый формат - "$(printf '\034')".

(Этот ответ уже был написан как комментарий.)

0 голосов
/ 11 января 2019

Если awk имеет проблемы, попробуйте Perl

$ cat -vT tonyren.txt
a^\b^\c^\d
p^\q^\r^\s
x^\y^\z

$ perl -F"\x1c" -le ' { print scalar @F } ' tonyren.txt
4
4
3

$
...