Я 'относительно новичок в 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
только.
Есть ли ошибка в синтаксисе, которую я не вижу, или я, возможно, использую этот синтаксис совершенно неправильно?
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
awk '$4 ~ /^[1-9]$|^10$/{print $1}' sample.txt
выход:
sample1
sample2
объяснение:
^[1-9]$
--> $4 должно быть одной цифрой от 1 до 9|
(труба) --> или^10$
--> $4 должно быть числом 10awk -F ':' '$4 >= 1 && $4 <= 10{print $1}'
Возможно, есть способ сделать это, используя только awk (неважно, см. мою правку ниже), но я его не знаю. Я бы объединил его с grep:
egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'
Я думаю, что вы сопоставляете четвертый столбец со строкой "1-10", а не с диапазоном. Кроме того, -F:
изменит разделитель на двоеточие, а не на пробел.
Редактировать:
awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt
Если вы хотите на awk для поиска значений из диапазона, то можно установить, что диапазон в начало
заявление.
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
Если Perl-это вариант, можно попробовать этот раствор похож на Kambus'ы решение на awk:
perl -lane 'print $F[0] if $F[3] >= 1 && $F[3] <= 10' sample.txt
Эти параметры командной строки используются:<БР>
-л
удаляет символы новой строки перед обработкой, и добавляет их в дальнейшем
`-режим autosplit – разбиения входных строк в массив @Ф.
-е
выполнение кода на Perl
@Ф
- это массив слов в каждой строке, нумеруются начиная с 0<БР>