Text-Processing

選擇文件中不包含另一個文件中的值的行

  • June 19, 2017

我有兩個文件。一種是包含 60490 行數據的 CSV。每行是一組值,例如客戶名稱、服務日期等。

第一個文件中的這些值之一是 VIN 值。

我有一個包含 92809 VIN 列表的第二個大文件。

我需要找到一種方法來刪除第一個文件中第二個文件中列出了 VIN 的所有行。

我試過下面的grep。這確實符合我的預期,但它也非常慢,並且在輸出大約 50 行後被作業系統殺死。

$ grep -v -f vinlist data.csv > output.csv

實現這一目標的最快方法是什麼?我在研究時發現的所有東西似乎都需要完全排序的數據,兩個文件中的行相同或需要很長時間/被作業系統殺死

數據.csv

123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1C4NJPBB4DD122174,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1GMDV33179D147281,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1FUYDCYB7WP879651,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1FM5K8D8XFGA82149,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,5TDBT48A72S003496,2014-01-20  

酒單:

JF1VA1E6XH9812361  
1HGCP26369A103521  
3N1CN7AP0CL810631  
5XYZK3AB7BG089758  
1FM5K8D8XFGA82149  
4S3BMBG61C3019520  
1FTNE24LX4HA22330  
1N4AL3AP8FC420210  
2GTEC19C491123429  
3N1CN7AP5FL944233  

由於我們知道 vin 在行中的位置,我們不需要進行一般搜尋。相反,我們可以將 vins 讀入一個資料結構,該結構被索引以允許快速查找。

使用 Python,您可以執行以下操作:

程式碼:

# read the vins into a set to allow fast lookup
with open('file3', 'rU') as f:
   vins = {vin.strip() for vin in f.readlines()}

# go through the data file one line at a time
with open('file2', 'rU') as f:
   for line in f.readlines():

       # get the vin in the line
       vin = line.split(',')[8]

       # if the vin is not in our set, print out the line
       if vin not in vins:
           print(line.strip())

結果:

123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1C4NJPBB4DD122174,2014-01-20
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1GMDV33179D147281,2014-01-20
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1FUYDCYB7WP879651,2014-01-20
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,5TDBT48A72S003496,2014-01-20

引用自:https://unix.stackexchange.com/questions/371836