Intereting Posts
Как проверить, что установка Apache Server работает? Запустите сценарий оболочки перед запуском tftpd работает как root, несмотря на явный вариант "–user tftp" Как я могу проверить, установлен ли каталог / tmp на моей системе CentOS 5.x на tmpfs? Присвоение значения эхо-каналам вместе с командой bc и использование переменной в качестве аргумента fstab связывает несогласованность. Лучше ли ссылка? Как я могу получить установку ESXi для загрузки PXE с использованием UEFI? Java JDK отсутствует путь libjli.so в списке зависимостей, Debian Простой Linux для Cyclone V – Arm Cortex A9 Как предоставить чтение / запись конкретному пользователю в любом существующем или будущем подкаталоге данного каталога? текущий фиксированный трек в строке состояния dwm Как игнорировать пустые каталоги при использовании `rm` с подстановочными знаками для нескольких каталогов в zsh? Могу ли я установить рабочую среду Deepin в Debian? Значки на жестком диске для настольных ПК не являются файлами или символическими ссылками в каталоге «~ / Desktop»? Как кодировать разные типы данных для STDOUT, чтобы STDIN мог определить, что это такое?

Как grep строки, которые имеют определенное значение в определенном столбце?

У меня есть файл как следующий

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 .

 "your data" | awk '$1 ~ /\.[05]00/' 

Я хотел бы grep только строки, которые имеют в первом столбце десятичные .000 и .500

Моя первая мысль

 grep '^ *[0-9][0-9][0-9]\.[50]00' filename 

Быстрый тест с использованием WSL

 $ head testdata 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 $ grep '^ *[0-9][0-9][0-9]\.[50]00' testdata 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 -E '^ *[0-9]{3}\.[50]00' testdata 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 

Если в первом столбце может быть не 3-значная целочисленная часть

 grep -E '^ *[0-9]+\.[05]00' testdata 

При некоторых обстоятельствах вам может потребоваться использовать [:digit:] вместо [0-9] .

И так далее.

man grep – ваш друг.

 awk '$1 ~ /\.[50]00/ { print $0 }' myFile.txt 

Первый столбец $1 будет сопоставлен с /\.500|\.000/

В зависимости от вашего варианта использования вы также можете использовать фактические числовые операции:

 $ awk '{a = $1 % 1} a == 0 || a == 0.5' /tmp/foo 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 

Протестировано с BSD awk (OSX El Capitan, 20070501) и GNU awk 4.1.4.

  grep -e '2[^ ]*.000' -e '2[^ ]*.500' file.txt 

С awk :

 $>awk '$1%.5==0' data.tsv 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 

С mlr :

 $>mlr --ifs tab --onidx filter '$1%.5==0' data.tsv 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, это может сработать для вас. Я сохранил первый вывод, который вы предоставили, в текстовый файл с именем «file.txt», а затем использовал следующую команду:

grep -e '2[^ ]*.000' file.txt & grep -e '2[^ ]*.500' file.txt

Что дает результат:

 200.000 1.353 0.086 200.500 1.359 0.091 201.500 1.373 0.093 201.000 1.365 0.093 202.500 1.392 0.087 202.000 1.383 0.091 203.500 1.412 0.073 203.000 1.402 0.081 204.500 1.432 0.055 204.000 1.423 0.065 205.000 1.441 0.045 

Вам не нужно будет сохранять вывод в текстовый файл, если он уже находится в файле. Но в случае, если он не сохраняется в файле, вы также можете передавать данные в команду grep, которую я предоставил, и она должна работать, по крайней мере, до тех пор, пока первый номер 2 в первом столбце больше не будет 2 . В этот момент вам нужно будет обновить команду grep соответствующим символом для правильной печати.

Что происходит с этой двойной командой grep это то, что первый grep отправляется на задний план с помощью оператора & . Когда он отправляется на задний план, следующая команда grep выполняет сразу же после этого, давая вам единый выход. Для задачи, которую вам нужно выполнить, чтобы сделать ее более легко, вы должны следовать примеру, который другие предоставили и использовали awk или даже sed .

(редактировать)

Это отнюдь не лучшее или наиболее эффективное использование grep для ваших нужд, но этого должно быть достаточно для того, чтобы вы немного поиграли и почувствовали себя лучше для grep.

Хорошо, немного поздно добавив в мой вклад, но я думаю, что это того стоит.

Требование к соответствию для OP – это первый столбец, имеющий десятичное значение только .000 или .500 . Нет никаких указаний относительно ведущей ценности, будь то диапазон или длина. Для надежности не следует полагать, что оно ограничено чем-либо, кроме того, что перед первым столбцом (или уже не первым столбцом) нет непустых символов, а содержание первого столбца будет иметь десятичную точку . , в нем где-то.

OP хочет использовать grep , который будет печатать всю строку при совпадении, поэтому единственное, что нужно сделать, это создать шаблон, который соответствует всем и только тем, что требуется.

Простота сама по себе, и нет причин использовать sed или awk поскольку `grep может обрабатывать источник как файл или канал.

Для grep файла используйте grep '^[^.]*\.[05]0\{2\}\s' the_file.txt

Чтобы grep из трубы, используйте my_command | grep '^[^.]*\.[05]0\{2\}\s' my_command | grep '^[^.]*\.[05]0\{2\}\s'

Шаблон: ^ , начинается в начале строки; [^.] , соответствует любому не десятичному символу; * , столько раз, сколько возможно (в том числе нет); \. , соответствуют десятичной точке; [05] , совпадают либо пять, либо ноль; 0\{2\} , соответствуют еще двум нулям (обратные косые черты перед открытой и закрывающей скобками не позволяют оболочке пытаться расширить брекет); \s , сопоставить символ пробела (то есть конец столбца) для использования в другом прецеденте, заменить разделителем столбцов, как правило, запятой, точкой с запятой или вкладкой \t ).

Обратите внимание, что это будет точно соответствовать запросу OP. Он не будет соответствовать .5000 или .0000 хотя и численно эквивалентен, потому что шаблон ищет пять или нуль, а затем ровно еще два нуля, за которыми следуют пробелы. Если это важно, то все остальные ответы до сих пор не соответствуют тому, что они будут соответствовать любому числу нулей, больше 1, после контрольной цифры. И кроме ответа FloHimself, они будут соответствовать чему-либо во втором столбце, начинающемся с .000 или .500 , включая .0003 и .500T , а одно из FloHimself будет соответствовать всем, что математически эквивалентно .0 и .5 , сколько бы ни было нулей. Последний, хотя и не соответствует тому, что заявлено OP, скорее всего, соответствует потребностям OP.

Наконец, если требуется мощность и скорость awk , хотя OP запросил grep , тогда команда будет:

С файлом awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt

С трубой my_command | awk '$1 ~ /[^.]\.[05]0{2}$/' my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'