Câu hỏi Grep để lọc tệp CSV khổng lồ


Tôi đang xử lý tệp CSV chứa hơn 2 triệu dòng. Khá lớn.

Tôi cần phải sử dụng grep (hoặc bất kỳ cách nào tốt hơn) để lấy toàn bộ hàng nếu giá trị của cột thứ hai khớp với 'jpn' hoặc 'por'.

Tôi đã thử sử dụng grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv nhưng đã không thành công cho đến nay. Vấn đề chính là 'por' là một sự xuất hiện phổ biến trên cột thứ ba, tạo ra hơn một triệu hàng không mong muốn.

Liệu bất kỳ người dùng có kinh nghiệm nào hơn có thể tử tế và cho tôi một số trợ giúp không?

Cảm ơn trước! : D


4
2017-10-17 02:28


gốc




Các câu trả lời:


Bạn đang sử dụng hệ điều hành Linux nào? Thử sử dụng egrep nếu bạn muốn sử dụng cụm từ thông dụng trong các hệ thống có phiên bản grep đã lỗi thời (ví dụ: Solaris).

Dù sao, đây là một giải pháp awk:

awk -F, '$2 ~ /jpn|por/ {print}' file1.csv > file2.csv

Giải thích:

  • awk cho các hoạt động dựa trên cột
  • -F, để xác định dấu phân cách / mã thông báo cột, trong trường hợp này tôi sử dụng dấu phẩy
  • $2 ~ /jpn|por/ kiểm tra cột số 2 với biểu thức /jpn|por/
    • $2 là cột số 2
    • /jpn|por/ là cụm từ thông dụng để khớp với jpn hoặc por
  • {print} xác định những gì awk nên đầu ra nếu nó tìm thấy một dòng phù hợp
    • print để in toàn bộ dòng đầu vào (cách khác, print $3 sẽ chỉ in cột # 3)
  • ... file1.csv chỉ định đọc từ tệp đầu vào thay vì stdin

11
2017-10-17 05:05



Tôi đang sử dụng OS X 10.10. - Mẹo của bạn đã hoạt động như một sự quyến rũ! Cảm ơn nhiều! ;) - YLeven


grep '; jpn;\|; por;' /path/to/file1.csv > file2.csv

Giả sử rằng dấu chấm phẩy (;) là dấu tách.


1
2017-10-17 03:02





Tôi không chắc chắn, nhưng có lẽ điều này có thể hoạt động:

grep '^[^,]*,\(por\|jpn\)\(,\|$\)' file1.csv > file2.csv

Giả sử rằng "," là dấu tách.


0
2017-10-17 04:05





Điều này dường như làm việc cho tôi:

egrep '^.?,(jpn|por),.*$' file1.csv > file2.csv

0
2017-10-17 06:04