awk игнорировать разделенные кавычки `echo 'a" b1 b2 "c' | awk '{print $ 2}' ` - PullRequest
0 голосов
/ 31 мая 2019

Следующее будет выводить "b1, поскольку оно распознает кавычки в качестве разделителя полей.Как мне сказать awk игнорировать заключенные в кавычки, чтобы это вывело b1 b2 или "b1 b2"

echo 'a "b1 b2" c'| awk '{print $2}'

Я вижу следующие два связанных поста, но у меня возникают проблемы с получением решения для работы.Я надеялся найти простое решение.Разбор полей - это особенность awk, верно?

awk игнорировать разделитель внутри одинарных кавычек в скобках Какой самый надежный способ эффективного анализа CSV с использованием awk?

Ответы [ 4 ]

4 голосов
/ 31 мая 2019

С gawk (GNU awk) вы можете использовать специальную переменную FPAT, чтобы определить, как выглядит поле, вместо того, чтобы ограничиваться указанием разделителя:

echo 'a "b1 b2" c'| gawk '{print $2}' FPAT='("[^"]+")|[^[:blank:]]+'

Здесь мы говорим: поле - это либо ", за которым следуют не " символы и закрывающий " -> ("[^"]+") ... или | последовательность непустых символов -> [^[:blank:]]+

Эти регулярные выражения будут оцениваться по порядку, поэтому поле, заключенное в "", имеет приоритет над вторым шаблоном, последовательностью непустых символов (по умолчанию в awk).


См. Руководство по GNU awk: Определение полей по содержимому

1 голос
/ 02 июня 2019

У awk нет простой и удобной поддержки полей в кавычках, которые я хотел. Я также посмотрел на разрез, и это не так.

Другой широко доступный инструмент оболочки bash, называемый csvcut, входящий в состав набора инструментов, называемый csvkit, обеспечивает простую поддержку полей в кавычках. Мои данные разделены пробелами, а не запятыми, но я легко могу указать разделитель пробелов для инструмента csvcut.

Вот что я хотел:

# Gives a
echo 'a "b1 b2" c d e' | csvcut -d ' ' -c 1
# Gives b1 b2
echo 'a "b1 b2" c d e' | csvcut -d ' ' -c 2
# Gives c
echo 'a "b1 b2" c d e' | csvcut -d ' ' -c 3
0 голосов
/ 31 мая 2019

Вы можете получить то, что вы ищете таким образом:

awk '{split($0,a,/^"|" "| "|" |"$/);j=a[1]!=""?0:1;print a[2+j]}'

Я думаю, вы можете найти способ, где это не удастся ...

0 голосов
/ 31 мая 2019

Кратчайший ответ:

echo 'a "b1 b2" c'| awk -F\" '{print $2}'

выдаст: b1 b2

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