Использование awk для поиска строк с несколькими цифрами
вот file1
200
201
202
203
204
205
2001
2002
2003
2004
2005
есть ли oneliner awk, который находит только строки с тремя цифрами в первом поле?
7 ответов
если предположить, что первое поле содержит только числа:
awk 'length() == 3' file1
если нет, перейдите к одному из решений regex.
альтернативное решение:
awk ' >= 100 && <= 999' file1
вывести все строки, в которых числовое значение первого поля находится в диапазоне (100,999). Это решение имеет два предостережения:
-
100aap
преобразуется к виду100
, и печатается. -
005
преобразуется к виду5
, и не получает напечатанный.
awk ' ~ /^[0-9][0-9][0-9]$/' file1
это будет соответствовать первому полю () только против трех цифр (обратите внимание на диапазон принудительного запуска и остановки, обозначенный
^
и $
). Затем он печатает всю строку (). Вам не нужно
{print }
после соответствия регулярному выражению, потому что действие по умолчанию-все равно распечатать строку.
если вы хотите использовать интервал выражение оператор {}
в вашем регулярном выражении вам нужно будет использовать gawk
и --posix
переключатель:
gawk --posix ' ~ /^[0-9]{3}$/' file1
вот:
awk ' ~ /^[[:digit:]]{3}$/' file1
или, если вы предпочитаете вместо класса символов POSIX:
awk ' ~ /^[0-9]{3}$/' file1
awk '/^[0-9][0-9][0-9]([^0-9]|$)/ {print }' file
чтобы найти строки, которые имеют только 3 цифры и ничего больше:
awk '/^[0-9][0-9][0-9]$/ {print }' file
немного неортодоксально, но вы также можете это сделать -
[jaypal~/Temp]$ cat text7
200
201
202
203
204
205
2001
2002
2003
2004
2005
[jaypal~/Temp]$ awk 'BEGIN{FS="";} NF<4{print}' text7
200
201
202
203
204
205
awk '{ if ( ~ /^[0-9][0-9][0-9]$/) print }' file
обратите внимание, что мы используем reg-ex, который указывает 3 класса char (что-нибудь внутри [..]
), of просто 0-9. Первое поле файла обозначается как $1. "^"И" $ " указывают начало и конец поля. Если у нас их нет, поля с 4 или более цифрами также будут совпадать.
надеюсь, это поможет.