Использование AWK для фильтрации столбцов с числовыми диапазонами - PullRequest
31 голосов
/ 05 января 2012

Я относительно новичок в BASH и пытаюсь использовать awk для фильтрации данных столбца 1 на основе 4-го столбца текстового файла. Если 4-й столбец данных соответствует диапазону x, он выведет данные столбца 1. Предполагается, что «х» представляет собой диапазон чисел 1-10 (1,2,3..10).

awk -F: '{ if($4=="x") print $1}' filename.txt

filename.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20

Фактическое использование:

awk -F: '{ if($4=="1-10") print $1}' sample.txt
output = sample1, sample2, sample3, sample4

Должно быть: sample1 sample2 только.

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

Ответы [ 6 ]

64 голосов
/ 05 января 2012
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
14 голосов
/ 05 января 2012
awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt

выход:

sample1
sample2

Объяснение:

  • ^[1-9]$ -> $ 4 должно быть одной цифрой от 1 до 9
  • | (труба) -> или
  • ^10$ -> $ 4 должно быть числом 10
4 голосов
/ 02 ноября 2016
awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
2 голосов
/ 05 января 2012

Может быть способ сделать это, используя только awk (не обращайте внимания, см. Мое редактирование ниже), но я не знаю об этом. Я бы совместил это с grep:

egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'

Я думаю, что вы сопоставляете четвертый столбец со строкой "1-10", а не с диапазоном. Кроме того, -F: изменит разделитель на двоеточие, а не на пробел.

Редактировать:

awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt
1 голос
/ 11 сентября 2015

Если Perl является опцией, вы можете попробовать это решение, похожее на решение awk от Kambus:

perl -lane 'print $F[0] if $F[3] >= 1 && $F[3] <= 10' sample.txt

Используются следующие параметры командной строки:

  • -n зацикливать вокруг каждой строки входного файла, не печатать автоматически каждую строку

  • -l удаляет новые строки перед обработкой и добавляет их обратно после

  • -a режим автоматического разделения - разбить входные строки на массив @F.

  • -e выполнить код perl

@F - массив слов в каждой строке, проиндексированный, начиная с 0

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

Если вы хотите, чтобы awk просматривал значения из диапазона, вы можете установить этот диапазон в операторе BEGIN.

awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 

Тест:

[jaypal:~/Temp] cat sample.txt 
sample1 0 0 4
sample2 0 0 10
sample3 0 0 15
sample4 0 0 20
[jaypal:~/Temp] awk 'BEGIN{for (i=1;i<=10;i++) a[i]} ($4 in a){print $1}' sample.txt 
sample1
sample2
...