Grep получает числа в диапазоне - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь отобразить строки, которые включают числа в диапазоне 20-200 в столбце 12 из файла CSV. Однако я не получаю правильный ввод.

Я пробовал это:

grep -E "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([2-9][0-9]|1[0-9][0-9]|200)" file.csv > sc1_d.csv

Что я делаю не так? Есть мысли?

Ответы [ 2 ]

4 голосов
/ 06 августа 2020

Делайте это просто, просто используйте awk:

awk -F, '(20 <= $12) && ($12 <= 200)' file

Если это не совсем то, что вы хотите, отредактируйте свой вопрос, чтобы объяснить, каким образом это и ваша собственная попытка «не получить правый ввод "и показать краткий, проверяемый образец ввода и ожидаемый результат.

3 голосов
/ 06 августа 2020

Здесь есть две проблемы.

(1) ваш способ поиска столбца 12 не будет работать ни в каких строках, в которых есть ячейки, содержащие запятые. И это трудно решить, если вы не знаете, кто написал CSV-файл. Поскольку единого CSV spe c не существует, существует несколько способов избежать запятых и кавычек в файлах CSV. Например, в одном spe c запятая в ячейке экранируется с помощью backsla sh (например, имя моего врача может быть записано как Dr. Bob\, MD. В другом - любое значение ячейки который содержит запятую, необходимо заключить в двойные кавычки, а сами двойные кавычки должны быть записаны как две двойные кавычки (так, "Dr. Bob, MD").

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

(2) Это выражение также допускает некоторые другие значения, такие как 201 или 20000B, которые вы не используете не хочу. Так что, если вы знаете, что это не последний столбец, вы можете просто добавить запятые после вариантов:

([2-9][0-9]|1[0-9][0-9]|200),

И если вы не можете сделать это предположение, вы можете просто посмотреть для запятой ИЛИ в конце строки:

([2-9][0-9]|1[0-9][0-9]|200)(,|$)

И, наконец, вы можете использовать «повтор», чтобы указать ровно 11 экземпляров шаблона [^,]*,. Итак, теперь ваша команда grep выглядит так:

grep -E "^([^,]*,){11}([2-9][0-9]|1[0-9][0-9]|200)(,|$)" file.csv > sc1_d.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...