Проблема регулярного выражения команды Unix awk - PullRequest
1 голос
/ 04 декабря 2009

У меня есть такие данные:

# data_display  

ab as we hj kl  
12 34 45 83 21  
45 56 98 45 09

Мне нужен только первый столбец, и только строки, начинающиеся с цифр.

Я сейчас использую:

# data_display | awk '{ print $1 }' | grep "^[0-9]"  

Есть ли способ оптимизировать его, например, использовать регулярное выражение в самом awk?

Я очень новичок в awk.

Спасибо.

KK

Ответы [ 6 ]

6 голосов
/ 04 декабря 2009

В awk регулярные выражения идут перед оператором print, включая фигурные скобки. Так что в вашем случае вызов awk будет:

awk '/^[0-9]/ {print $1}'
2 голосов
/ 04 декабря 2009

Вы можете поместить grep regexp в команду awk напрямую:

data_display | awk '/^[0-9]/{ print $1 }'
1 голос
/ 25 декабря 2009

cut -d '' -f1 имя файла | grep '^ [0-9]'

это должно быть самым быстрым. поскольку awk ищет и классифицирует файл как записи и поля.

здесь мы минимизируем объем данных, которые должен обрабатывать grep, обрезая первое поле.

1 голос
/ 04 декабря 2009

для большей точности проверьте действительные числа (в случае, если у вас есть данные, такие как 1a, который не является числом, но будет соответствовать, используя решение, данное до сих пор.

$ awk '$1+0==$1' file

или

awk '$1 ~/^[0-9]+$/' file
1 голос
/ 04 декабря 2009

Вы можете использовать cut вместо awk:

$ data_display | grep '^[0-9]' | cut -f 1 -d ' '
0 голосов
/ 04 декабря 2009

Конечно, вы можете:

pax> echo 'ab as we hj kl  
12 34 45 83 21  
45 56 98 45 09' | awk '/^[0-9]/ {print $1}'

дает вам:

12
45

Awk команды состоят из фактического шаблона для сопоставления и команды для запуска Если шаблона нет, команда выполняется для всех строк.

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