Php

在文件中的列上執行(垂直?)差異

  • February 8, 2010

在我們公司,我們從第三方獲取庫存文件。這些文件採用固定格式,包含 13 位 EAN(想想 UPC 程式碼)以及其他數據。我的數據庫中還有一個 EAN 主列表。

我想將主文件與新文件進行比較,並從新文件中刪除所有行,其中包含不在主文件中的 EAN。

範例:大師

1234567890123

4567890123456

新文件 1234567890123 4567890123456

5678901234567 <- 刪除這個

新文件包含 EAN 以外的數據。EAN 在第一列。數據是製表符分隔的。

我目前正在 PHP 中執行此操作。問題是兩個文件都有大約 4 百萬。每一行,我的腳本都消耗大量記憶體。我目前將整個主列表載入到 RAM 中並執行 isset()s。

有什麼聰明的 linux 技巧/程序可以幫助我嗎?

以更 grep 友好的方式重新表述問題,您希望列印與某個 EAN 主列表中的 EAN 匹配的所有行。

假設類似於 EAN 的東西不會出現在 EAN 列之外的任何地方,請嘗試:

  • 從中提取所有 EANmaster
  • 將 EAN 列表壓縮為正則表達式
  • 將正則表達式輸入 egrep

假設 EAN 是master(並且該主包含其他列)的第一列

egrep "(`cat master | awk '{print $1}' | tr '\n' '\\|' | sed 's/|$//'`)" newfile

應該接近(您可以刪除awkifmaster只是一個 EAN 列表;討厭的 sed 在最後刪除|來自管道其餘部分的尾隨)

如果 EAN(或類似 EAN 的 13 位模式)存在於數據中的其他位置,則上述內容將失效,並且需要更複雜的正則表達式來將搜尋限製到特定列。

引用自:https://serverfault.com/questions/110851