Рейтинг:1

Сопоставление с образцом с использованием Grep

флаг bd

Я пытаюсь найти конкретное значение для моего файла, вот его краткий фрагмент:

Product_type_name, product_class_name, product_sub_class_name, product_minor_class_name, product_country_origin_name, product_sku_no, product_long_name, product_persell_sellesla_sellesla_sellesla_sellesla_sellesla_sellesla_sellesla_sellesla_peslay_peslale_peslale_peslayr_
ЛИКЕР, ВИНО, СТОЛОВОЕ ВИНО, СТОЛОВОЕ ВИНО КРАСНОЕ, КАНАДА, 198267, COPPER MOON - MALBEC, 48162013513,3,1,14,30.99,0
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО БЕЛОЕ,КАНАДА,305375,DOMAINE D'OR - DRY,48162001886,4,1,11.5,32.99,0
ЛИКЕР, ВИНО, СТОЛОВОЕ ВИНО, СТОЛОВОЕ ВИНО КРАСНОЕ, КАНАДА, 53017, SOMMET ROUGE, 58976055050,4,1,12,29.99,0
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО БЕЛОЕ,КАНАДА,215525,МИССИЯ РИДЖ - ПРЕМИУМ СУХОЕ БЕЛОЕ,779646155251,4,1,11,33.99,1
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО КРАСНОЕ,СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ,168971,ZINFANDEL - BIG HOUSE CARDINAL ZIN,81308001456,3,1,13.5,36.99,0
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО КРАСНОЕ,ФРАНЦИЯ,234559,LE VILLAGEOIS RED - CELLIERS LA SALLE,63657001448,4,1,11,34.99,0
ЛИКЕР, ВИНО, СТОЛОВОЕ ВИНО, СТОЛОВОЕ ВИНО КРАСНОЕ, КАНАДА, 492314, SAWMILL CREEK - MERLOT, 63657004074,16,1,12.5,119,0
ЛИКЕР, ВИНО, СТОЛОВОЕ ВИНО, СТОЛОВОЕ ВИНО БЕЛОЕ, КАНАДА, 587584, SOLA, 63657006566,4,1,12,32.99,0
ЛИКЕР, ВИНО, СТОЛОВОЕ ВИНО, СТОЛОВОЕ ВИНО БЕЛОЕ, КАНАДА, 100925, GANTON & LARSEN PROSPECT - PINOT BLANC BIRCH CANOE 2011,776545400000,0.75,1,11.5,13.99,0
ЛИКЕР,СПИРТЫ,ИРЛАНДСКИЙ ВИСКИ,ИРЛАНДСКИЙ ВИСКИ,ИРЛАНДИЯ,10157,JAMESON - IRISH,80432500170,0.75,1,40,34.99,NA
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО БЕЛОЕ,ИТАЛИЯ,102764,PINOT GRIGIO DELLE VENEZIE - RUFFINO LUMINA,8001660197156,0.75,1,12.5,15.99,0
ЛИКЕР, СПИРТЫ, АМЕРИКАНСКИЙ ВИСКИ, АМЕРИКАНСКИЙ ВИСКИ, СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ, 103747, МАКЕРСКАЯ МАРКА - KENTUCKY BOURBON, 85246139431,0.75,1,45,44.95,NA
ЛИКЕР,СПИРТЫ,ДЖИН,СУХОЙ ДЖИН,КАНАДА,1040,GORDONS - LONDON DRY,622153139040,0.75,1,40,24.49,NA
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО БЕЛОЕ,КАНАДА,104679,CALONA - ARTIST SERIES RESERVE PINOT GRIS 2011/13,58976501656,0.75,1,13.5,12.99,0
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО КРАСНОЕ,СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ,106476,ПИНО НУАР - СИДУРИ РУССКАЯ РЕКА 11/12,626990184140,0.75,1,14.5,49.99,0
НАПИТКИ, НАПИТКИ, CACACACA, CACACACA, БРАЗИЛИЯ, 107029, CACHACA 61,7896547500676,0.7,1,40,28.95,2
ЛИКЕР, ВИНО, СТОЛОВОЕ ВИНО, СТОЛОВОЕ ВИНО КРАСНОЕ, ФРАНЦИЯ, 109082, CHATEAU PAVIE DECESSE 2008,,0.75,1,13,239,0
ЛИКЕР,СПИРТЫ,ШОТЛАНДСКИЙ ВИСКИ,ШОТЛАНДСКИЙ - СМЕСЬ,СОЕДИНЕННОЕ КОРОЛЕВСТВО,1099,ДЖОННИ УОКЕР - RED LABEL,622153631049,0.75,1,40,29.99,NA
ЛИКЕР,ВИНО,СТОЛОВОЕ ВИНО,СТОЛОВОЕ ВИНО КРАСНОЕ,ИТАЛИЯ,110460,LE CONTRADE - CO.PRO.VI,8004753004010,1,1,12,9.9,0
ЛИКЕР,СПИРТЫ,РОМ,ТЕМНЫЙ,КАНАДА,112433,BACARDI - ЧЕРНЫЙ,620213055408,0.75,1,40,23.75,NA
ЛИКЕР, ВИНО, АПЕРИТИВ, ДЕСЕРТ И КРЕМИРОВАННОЕ ВИНО, МОНТИЛЬЯ, ИСПАНИЯ, 112789, АЛЬВАРЬ - СРЕДНЕ СУХОЕ, 766238303374,0.75,1,17,17.99,3
ЛИКЕР,СПИРТЫ,ШОТЛАНДСКИЙ ВИСКИ,ШОТЛАНДСКИЙ - СМЕСЬ,СОЕДИНЕННОЕ КОРОЛЕВСТВО,112896,ДЖОННИ УОКЕР - RED LABEL,622153631070,1.75,1,40,68.99,NA

Теперь мне нужно использовать grep, я бы предпочел, чтобы решение не включало sed, perl, awk или циклы. Я пытался:

grep -E "^.*(,.*){9}[^0]+" BC_Liquor_Store_Product_Price_List.csv

Но это, очевидно, получает все. Мне нужно получить все строки, в которых PRODUCT_LITRES_PER_CONTAINER >= 1, но я просто не могу понять, как это сделать. .* получает все, но перед , есть слова, поэтому я не могу просто сделать:

grep -E "^(,.*){9}[^0]+" BC_Liquor_Store_Product_Price_List.csv

который будет соответствовать только строкам, начинающимся с ,?

флаг hr
*"Я бы предпочел, чтобы решение не включало sed, perl, awk или циклы"* Почему? Зачем усложнять жизнь, используя неправильный инструмент для работы?
Yunfei Chen avatar
флаг bd
@steeldriver У меня есть система с определенными ограничениями, поэтому мне нужно, чтобы она была кроссплатформенной и встроенной, поэтому я не хочу сталкиваться с какими-либо проблемами позже ... Также уже есть много решений с awk и perl онлайн, поэтому это просто использование grep, но нет решений, использующих grep...
Yunfei Chen avatar
флаг bd
Наверняка такое возможно с помощью grep??
terdon avatar
флаг cn
`grep` менее переносим, ​​чем sed, awk или perl. Зачем вам наименее портативное из доступных решений?
флаг gy
@steeldriver Скорее всего, потому что это то же назначение, что и https://unix.stackexchange.com/questions/653643/grep-and-cut-command-in-linux?
Рейтинг:4
флаг hr

Видеть Что подразумевается под фразой «Теперь у вас две проблемы»?

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы. - Джейми Завински

То, за что вы, кажется, цепляетесь,

grep -E "^([^,]*,){8}[^0]" BC_Liquor_Store_Product_Price_List.csv

Это

  • привязан к началу строки ^
  • соответствует любому количеству символов без запятой, за которыми следует запятая, 8 раз
  • затем сопоставьте не-0 символ в начале 9-го поля

Однако ИМХО это хрупко и не должно использоваться в каких-либо серьезных приложениях. Особенно сложно надежно сопоставить числовые значения - см., например,

особенно раздел «Примечание о сопоставлении чисел (подсказка: это сложнее, чем вы думаете)». Вместо этого рассмотрите возможность использования чего-то вроде

awk -F, 'NR==1 || $9+0 > 1,0' BC_Liquor_Store_Product_Price_List.csv

или же

perl -F, -lne 'печатать, если $. == 1 || $F[8] >= 1.0' BC_Liquor_Store_Product_Price_List.csv

или (лучше, так как он будет обрабатывать сложные функции CSV, такие как цитирование и встроенные запятые)

mlr --csv filter '$PRODUCT_LITRES_PER_CONTAINER >= 1.0' BC_Liquor_Store_Product_Price_List.csv
Yunfei Chen avatar
флаг bd
Что вы подразумеваете под хрупким??
флаг hr
Ну, только что пришло мне в голову - если поле пусто, `[^0]` будет соответствовать следующему `,` - версии Awk и Miller обе (правильно) приведут пустую строку к числовому 0 и, следовательно, исключат результат. Вероятно, есть и другие крайние случаи - отсюда и цитата;)

Ответить или комментировать

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