awk, поле не соответствует, но должно соответствовать - PullRequest
1 голос
/ 23 января 2012

У меня есть файл, структурированный как список записей, где разделитель полей равен \ t.Я хочу извлечь только записи, где второе поле является числом от 1 до 9, но мой скрипт awk не работает.Скрипт awk

cat file |awk -v FS="\t" '$2 ~ /[0-9]{1}/ {print $0;}'

или

cat file |awk -v FS="\t" '$2 ~ /.{1}/ {print $0;}'  #because the second fields of my file have  all second fields as number

Почему эти скрипты не работают?Разве регулярное выражение не является хорошим регулярным выражением?

Ответы [ 2 ]

1 голос
/ 23 января 2012

Если вы хотите убедиться, что 2-е поле представляет собой однозначное число, вам на самом деле не нужно регулярное выражение:

awk '1 <= $2 && $2 <= 9 {print}'
1 голос
/ 23 января 2012

Обновление

Даже с интервалом {1} вы все равно будете сопоставлять поле, например 23, поскольку 2 соответствует одному числу.То, что вы действительно хотите использовать - это привязки и забыть об интервалах:

awk '$2 ~ /^[0-9]$/{print}' FS="\t" file

Проблема заключается в использовании интервалов {1}.awk меньше версии 4 не поддерживает интервалы.gawk с другой стороны будет, если вы добавите следующий флаг: --re-interval

Попробуйте это:

awk --re-interval '$2 ~ /[0-9]{1}/{print}' FS="\t" file

Некоторые другие примечания:

  1. Встроенные переменные, такие как FS, могут быть назначены в конце без необходимости -v
  2. Вы можете использовать просто print вместо print $0, так как это поведение по умолчанию
  3. Бесполезное использование cat.awk может принять файл в качестве аргумента, используйте его вместо
...