Подтвердить что ты не робот

Использование AWK для фильтрации столбца с числовыми диапазонами

Я относительно не знаком с BASH, и я пытаюсь использовать awk для фильтрации данных столбца 1 на основе 4-го столбца текстового файла. Если 4-й столбец данных соответствует диапазону x, то он выведет данные столбца 1. "x" - это диапазон чисел 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.

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

4b9b3361

Ответ 1

awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt

Ответ 2

awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt

выход:

sample1
sample2

объяснение:

  • ^[1-9]$ → $4 должна быть одной цифрой от 1 до 9
  • | (труба) → или
  • ^10$ → $4 должно быть числом 10

Ответ 3

awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'

Ответ 4

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

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

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

Изменить:

awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt

Ответ 5

Если вы хотите, чтобы 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

Ответ 6

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

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

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

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

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

  • -a режим автосплит - разделение входных строк на массив @F.

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

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