Ответ 1
awk '{ if ($4 >= 1 && $4 <= 10) print $1 }' sample.txt
Я относительно не знаком с 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 (nevermind, см. мое редактирование ниже), но я не знаю об этом. Я бы совпадал с grep:
egrep ' ([1-9]|10)$' sample.txt | awk '{print $1}'
Я думаю, что вы соответствуете четвертому столбцу со строкой "1-10", а не диапазоном. Кроме того, -F:
изменяет разделитель на двоеточие, а не на пробел.
Изменить:
awk '$4 ~ /^([1-9]|10)$/ {print $1}' sample.txt
Если вы хотите, чтобы 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
Если 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