題 Grep可以過濾巨大的CSV文件


我正在處理包含超過200萬行的CSV文件。相當大的一個。

如果第二列的值匹配'jpn'或'por',我需要使用grep(或任何更好的方法)來檢索整行。

我試過用 grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv 但到目前為止沒有成功。主要問題是'por'在第三列中很常見,它會產生超過一百萬個不需要的行。

更有經驗的用戶是否會善待並藉給我一些幫助?

提前致謝! :d


4
2017-10-17 02:28


起源




答案:


您使用的是什麼Linux操作系統?嘗試使用 egrep 如果要在grep版本過時的系統中使用正則表達式(例如Solaris)。

無論如何,這是一個awk解決方案:

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

說明:

  • awk 用於基於列的操作
  • -F, 定義列分隔符/標記化器,在這種情況下我使用逗號
  • $2 ~ /jpn|por/ 用表達式測試第2列 /jpn|por/
    • $2 是第2列
    • /jpn|por/ 是一個匹配jpn或por的正則表達式
  • {print} 指定awk在找到匹配行時應輸出的內容
    • print 打印整個輸入行(或者, print $3 將只打印第3列)
  • ... file1.csv 指定從輸入文件而不是stdin讀取

11
2017-10-17 05:05



我正在使用OS X 10.10。 - 你的小費就像一個魅力!非常感謝你! ;) - YLeven


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

假設分號(;)是分隔符。


1
2017-10-17 03:02





我不確定,但也許這可行:

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

假設“,”是分隔符。


0
2017-10-17 04:05





這似乎對我有用:

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

0
2017-10-17 06:04