У меня есть файл как следующий
200.000 1.353 0.086
200.250 1.417 0.000
200.500 1.359 0.091
200.750 1.423 0.000
201.000 1.365 0.093
201.250 1.427 0.000
201.500 1.373 0.093
201.750 1.432 0.000
202.000 1.383 0.091
202.250 1.435 0.000
202.500 1.392 0.087
202.750 1.436 0.000
203.000 1.402 0.081
203.250 1.437 0.001
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045
Я хотел бы grep только те строки, которые имеют в первом столбце десятичные .000 и .500 только так, чтобы вывод был таким
200.000 1.353 0.086
200.500 1.359 0.091
201.000 1.365 0.093
201.500 1.373 0.093
202.000 1.383 0.091
202.500 1.392 0.087
203.000 1.402 0.081
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045
Ответы:
Вы не используете grep. Использование
awk
.источник
awk '$1 ~ /\.[05]0*$/'
.awk '$1 ~ /\.[05]00$/'
себе (потребовал ровно три цифры), если только у меня не было оснований полагать, что на входе ожидаются переменные десятичные разряды.echo 0.5001 | awk '$1 ~ /\.[05]00/'
. Надежно работает только если их ровно три.Первый столбец
$1
будет сопоставлен с/\.500|\.000/
точками, которые экранируются, чтобы быть буквальными точками, не выявлять символы,~
совпадающие с частичными, и выводить всю строку$0
источник
{ print $0 }
; это действие Awk по умолчанию.Моя первая мысль
Быстрый тест с использованием WSL
Есть более краткие способы выразить это.
Если первый столбец может содержать целую часть, отличную от 3 цифр
При некоторых обстоятельствах вам может потребоваться использовать
[:digit:]
вместо[0-9]
.И так далее.
man grep
твой друг.источник
grep
проще в использовании, чем у меня. Я бы не отправил ответ, если бы увидел это первым. Хорошая работа!В зависимости от вашего варианта использования вы также можете использовать реальные числовые операции:
Протестировано с BSD awk (OSX El Capitan, 20070501) и GNU awk 4.1.4.
источник
источник
С
awk
:С
mlr
:источник
Хорошо, немного опоздал с добавлением моего вклада, но я думаю, что оно того стоит.
Требование к выполнению согласно ОП - это первый столбец с десятичным значением
.000
или.500
только. Там нет никаких оговорок в отношении ведущего значения, ни по диапазону, ни по длине. Для надежности не следует предполагать, что он ограничен ничем, кроме того, что перед первым столбцом нет непустых символов (или это уже не первый столбец) и что содержимое первого столбца будет иметь десятичную точку.
, в этом где-то.OP хочет использовать
grep
, который будет печатать всю строку, когда найдено совпадение, поэтому единственное, что нужно сделать, это создать шаблон, который соответствует всем и только тому, что требуется.Сама простота и отсутствие причин использовать
sed
илиawk
как `grep может обрабатывать исходный код как файл или канал.Для
grep
использования файлаgrep '^[^.]*\.[05]0\{2\}\s' the_file.txt
Чтобы
grep
из трубы использоватьmy_command | grep '^[^.]*\.[05]0\{2\}\s'
Шаблон:,
^
начать с начала строки;[^.]
соответствовать любому не десятичному символу;*
столько раз, сколько возможно (включая ни одного);\.
соответствует десятичной запятой;[05]
соответствует либо пять, либо ноль;0\{2\}
, сопоставьте еще 2 нуля (обратная косая черта перед открывающей и закрывающей скобкой не позволяет оболочке попытаться выполнить расширение скобки);\s
, соответствует символу пробела (имеется в виду конец столбца - для использования в другом случае, замените его разделителем столбца, обычно это запятая, точка с запятой или табуляция\t
).Обратите внимание, что это будет точно соответствовать тому, что спросил ОП. Он не будет совпадать
.5000
или.0000
даже численно эквивалентен, потому что шаблон ищет пять или ноль, за которыми следуют ровно 2 ноля, за которыми следует пробел. Если это важно, то все остальные ответы до сих пор терпят неудачу, так как они будут соответствовать любому количеству нулей, больше 1, после контрольной цифры. И кроме ответа от FloHimself, они будут соответствовать чему-либо во втором столбце, который начинается.000
или.500
, включая.0003
и.500T
, и тот, что FloHimself, будет соответствовать всему, что математически эквивалентно.0
и.5
независимо от того, сколько нулей. Последний, хотя и не соответствует заявленному ФП, в любом случае, скорее всего, будет соответствовать его нуждам.Наконец, если
awk
требуется мощность и скорость, даже если запрашивается OPgrep
, тогда команда будет:С файлом
awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt
С трубкой
my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'
источник
Если вы настаиваете на использовании grep, то это может сработать для вас. Я сохранил первый вывод, который вы предоставляете, в текстовый файл с именем «file.txt», а затем использовал следующую команду:
grep -e '2[^ ]*.000' file.txt & grep -e '2[^ ]*.500' file.txt
Который дает вывод:
Вам не нужно сохранять вывод в текстовый файл, если он уже есть в файле. Но если он не сохраняется в файл, вы также можете передать данные в предоставленную мною команду grep, и она должна работать по крайней мере до самого первого числа
2
, в первом столбце больше нет2
. В этот момент вам нужно обновить команду grep соответствующим символом для правильной печати.Что происходит с этой двойной
grep
командой, так это то, что перваяgrep
отправляется на задний план с&
оператором. Поскольку она отправляется в фоновый режим, следующаяgrep
команда выполняется сразу же после этого, давая вам одинаковый вывод. Чтобы задача, которую вам нужно было выполнить, была более легкой, вы должны следовать примеру, который другие приводили, использовалиawk
или даже использовалиsed
.(редактировать)
Это ни в коем случае не лучшее и не самое эффективное использование grep для ваших нужд, но этого должно быть достаточно, чтобы вы немного поиграли и лучше почувствовали grep.
источник
.500
и.000
первому столбцу. Если это необходимо в определенном порядке, например, от наименьшего к наибольшему, это легко сделать. Однако первые 3 цифры первых печатаемых столбцов располагаются в наименьшем порядке. Это результат2[^ ]*.000
и2[^ ]*.500
. Это вполне соответствует тому, что спросил ОП.