Проблема с регулярным выражением команды Unix awk

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

# 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


person kk.    schedule 04.12.2009    source источник


Ответы (6)


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

awk '/^[0-9]/ {print $1}'
person LiraNuna    schedule 04.12.2009

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

data_display | awk '/^[0-9]/{ print $1 }'
person rsp    schedule 04.12.2009

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

$ data_display | grep '^[0-9]' | cut -f 1 -d ' '
person Svante    schedule 04.12.2009
comment
зачем использовать 2 команды, когда 1 уже делает это... производя накладные расходы - person ghostdog74; 04.12.2009
comment
levislevis85, вы всегда должны проверять свои предположения. awk — полноценный язык программирования, cut и grep — более простые инструменты. Вы проверили, какие накладные расходы больше? Я просто указываю на варианты. - person Svante; 04.12.2009
comment
Во всяком случае, я думаю, что cut появляется, когда awk не может использовать механизм $1. Самое смешное, что перемещение регулярного выражения из внешнего grep в awk-скрипт почти ничего не меняет, поэтому накладные расходы на дополнительные команды кажутся незначительными. - person Svante; 04.12.2009
comment
Я проголосовал за этот, потому что он сначала заботится обо всех строках, которые ему НЕ нужно обрабатывать, а затем использует более простой разрез по сложному awk для выполнения работы. Это вопрос, будет ли вызов двух простых программ быстрее, чем одна сложная, я предполагаю, что это зависит от самого набора данных. - person Marcin; 25.12.2009

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

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

or

awk '$1 ~/^[0-9]+$/' file
person ghostdog74    schedule 04.12.2009

вырезать -d' ' -f1 имя файла | grep '^[0-9]'

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

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

person Venkataramesh Kommoju    schedule 25.12.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 команды состоят из фактического шаблона для сопоставления и команды для запуска. Если шаблона нет, команда выполняется для всех строк.

person paxdiablo    schedule 04.12.2009