Điểm:1

Khớp mẫu bằng Grep

lá cờ bd

Tôi đang cố gắng tìm một giá trị cụ thể cho tệp của mình, đây là một đoạn trích nhanh về nó:

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_BASE_UPC_NO,PRODUCT_LITRES_PER_CONTAINER,PRD_CONTAINER_PER_SELL_UNIT,PRODUCT_ALCOHOL_PERCENT,CURRENT_DISPLAY_PRICE_CODESWEETNES
RƯỢU,RƯỢU,BÀN RƯỢU,BÀN RƯỢU ĐỎ,CANADA,198267,COPPER MOON - MALBEC,48162013513,3,1,14,30.99,0
RƯỢU,RƯỢU,BÀN RƯỢU,BÀN RƯỢU TRẮNG,CANADA,305375,DOMAINE D'OR - DRY,48162001886,4,1,11.5,32.99,0
RƯỢU, RƯỢU, RƯỢU BÀN, RƯỢU BÀN ĐỎ, CANADA,53017,SOMMET ROUGE,58976055050,4,1,12,29.99,0
RƯỢU, RƯỢU, RƯỢU ĐỂ BÀN, RƯỢU ĐỂ BÀN, CANADA,215525,MISSION RIDGE - PREMIUM DRY WHITE,779646155251,4,1,11,33,99,1
RƯỢU, RƯỢU, RƯỢU ĐỂ BÀN, RƯỢU BÀN ĐỎ, HOA KỲ MỸ,168971,ZINFANDEL - BIG HOUSE CARDINAL ZIN,81308001456,3,1,13.5,36.99,0
RƯỢU,RƯỢU,BÀN RƯỢU,BÀN RƯỢU ĐỎ,PHÁP,234559,LE VILLAGEOIS RED - CELLIERS LA SALLE,63657001448,4,1,11,34.99,0
RƯỢU, RƯỢU, RƯỢU BÀN, RƯỢU BÀN ĐỎ, CANADA,492314,SAWMILL CREEK - MERLOT,63657004074,16,1,12.5,119,0
RƯỢU, RƯỢU, RƯỢU ĐỂ BÀN, RƯỢU ĐỂ BÀN, CANADA,587584,Sola,63657006566,4,1,12,32.99,0
RƯỢU, RƯỢU, RƯỢU BÀN, RƯỢU VANG TRẮNG, CANADA,100925,GANTON & LARSEN TRIỂN VỌNG - PINOT BLANC BIRCH CANOE 2011,776545400000,0.75,1,11.5,13.99,0
RƯỢU,RƯỢU RƯỢU,Irish uýt,Irish uýt,Ireland,10157,JAMESON - IRISH,80432500170,0.75,1,40,34.99,NA
RƯỢU,RƯỢU VANG,RƯỢU BÀN,RƯỢU BÀN TRẮNG,Ý,102764,PINOT GRIGIO DELLE VENEZIE - RUFFINO LUMINA,8001660197156,0.75,1,12.5,15.99,0
RƯỢU,Rượu mạnh,Rượu whisky Mỹ,Rượu whisky Mỹ,MỸ,103747,MAKER'S MARK - KENTUCKY BOURBON,85246139431,0.75,1,45,44.95,NA
RƯỢU,RƯỢU RƯỢU,RƯỢU GIN,DRY GIN,CANADA,1040,GORDONS - LONDON DRY,622153139040,0.75,1,40,24.49,NA
RƯỢU, RƯỢU VANG, RƯỢU BÀN, RƯỢU BÀN WHITE, CANADA,104679,CALONA - ARTIST SERIES RESERVE PINOT GRIS 2011/13,58976501656,0.75,1,13.5,12.99,0
RƯỢU, RƯỢU, RƯỢU BÀN, RƯỢU BÀN ĐỎ, HOA KỲ MỸ,106476,PINOT NOIR - SIDURI RUSSIAN SÔNG 12/11,626990184140,0.75,1,14.5,49.99,0
RƯỢU,RƯỢU,CACHACA,CACHACA,BRAZIL,107029,CACHACA 61,7896547500676,0.7,1,40,28.95,2
RƯỢU, RƯỢU, RƯỢU BÀN, RƯỢU BÀN ĐỎ, PHÁP,109082,CHATEAU PAVIE DECESSE 2008,,0.75,1,13,239,0
RƯỢU,RƯỢU RƯỢU,SCOTTH WHISKY,SCOTCH - BLEND,VƯƠNG QUỐC ANH,1099,JOHNNIE WALKER - RED LABEL,622153631049,0.75,1,40,29.99,NA
RƯỢU,RƯỢU,BẠN RƯỢU,BÀN RƯỢU ĐỎ,Ý,110460,LE CONTRADE - CO.PRO.VI,8004753004010,1,1,12,9.9,0
RƯỢU,RƯỢU RƯỢU,RUM,TỐI,CANADA,112433,BACARDI - BLACK,620213055408,0.75,1,40,23.75,NA
RƯỢU, RƯỢU VANG, RƯỢU TRÁNG MIỆNG APERITIF VÀ RƯỢU VANG TĂNG CƯỜNG,MONTILLA,TÂY BAN NHA,112789,ALVEAR - KHÔ VỪA,766238303374,0.75,1,17,17.99,3
RƯỢU,RƯỢU,SCOTTH WHISKY,SCOTCH - BLEND,Vương quốc Anh,112896,JOHNNIE WALKER - RED LABEL,622153631070,1.75,1,40,68.99,NA

Bây giờ tôi cần sử dụng grep, tôi sẽ thích hơn nếu giải pháp không liên quan đến sed, perl, awk hoặc vòng lặp. tôi đã thử:

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

Nhưng điều đó rõ ràng có được mọi thứ. Tôi cần lấy tất cả các hàng có PRODUCT_LITRES_PER_CONTAINER >= 1 nhưng tôi không thể tìm ra cách thực hiện. .* được mọi thứ nhưng trước , có những từ nên tôi không thể làm được:

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

sẽ chỉ khớp với các dòng bắt đầu bằng ,?

lá cờ hr
*"Tôi thích hơn nếu giải pháp không liên quan đến sed, perl, awk hoặc vòng lặp"* Tại sao? Tại sao làm cho cuộc sống khó khăn hơn bằng cách sử dụng sai công cụ cho công việc?
Yunfei Chen avatar
lá cờ bd
@steeldriver Tôi có một hệ thống có một số hạn chế nhất định và vì vậy tôi cần nó phải đa nền tảng và nó được nhúng vào nên tôi không muốn gặp phải bất kỳ sự cố nào sau này... Ngoài ra, đã có rất nhiều giải pháp với awk và perl trực tuyến vì vậy đây chỉ là sử dụng grep chứ không có giải pháp nào sử dụng grep...
Yunfei Chen avatar
lá cờ bd
Chắc chắn một điều như vậy là có thể sử dụng grep ??
terdon avatar
lá cờ cn
`grep` ít di động hơn sed, awk hoặc perl. Tại sao bạn muốn giải pháp khả dụng ít di động nhất?
lá cờ gy
@steeldriver Rất có thể vì đó là nhiệm vụ giống như https://unix.stackexchange.com/questions/653643/grep-and-cut-command-in-linux ?
Điểm:4
lá cờ hr

Nhìn thấy Bây giờ bạn có hai vấn đề có nghĩa là gì?

Một số người, khi đối mặt với một vấn đề, nghĩ rằng "Tôi biết, tôi sẽ sử dụng các biểu thức thông thường." Bây giờ họ có hai vấn đề. - Jamie Zawinski

Những gì bạn dường như đang nắm bắt là

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

Đó là

  • neo vào đầu dòng ^
  • khớp với bất kỳ số lượng ký tự không phải dấu phẩy theo sau bởi dấu phẩy, 8 lần
  • sau đó phù hợp với một không0 ký tự ở đầu trường thứ 9

Tuy nhiên IMHO điều này rất mong manh và không nên được sử dụng trong bất kỳ ứng dụng nghiêm trọng nào. Đặc biệt khó khớp các giá trị số một cách đáng tin cậy - xem ví dụ

đặc biệt là phần "Lưu ý về việc ghép số (Gợi ý: Nó khó hơn bạn nghĩ)". Vui lòng xem xét thay vì sử dụng một cái gì đó như

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

hoặc

perl -F, -lne 'in nếu $. == 1 || $F[8] >= 1.0' BC_Liquor_Store_Product_Price_List.csv

hoặc (tốt hơn, vì nó sẽ xử lý các tính năng CSV phức tạp như trích dẫn và dấu phẩy được nhúng)

mlr --csv bộ lọc '$PRODUCT_LITRES_PER_CONTAINER >= 1.0' BC_Liquor_Store_Product_Price_List.csv
Yunfei Chen avatar
lá cờ bd
Bạn có ý nghĩa gì bởi mong manh ??
lá cờ hr
Chà, tôi vừa mới nghĩ ra - nếu trường trống, `[^0]` sẽ khớp với `,` sau đây - cả hai phiên bản Awk và Miller sẽ (chính xác) ép buộc chuỗi trống thành số 0 và do đó loại trừ kết quả. Có khả năng các trường hợp cạnh khác - do đó trích dẫn;)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.