在大型文本文件中查找多個字元串列表的最佳方法是什麼
簡短而普遍的問題是:在 Unix/Linux 中,在大型文本文件中查找幾個(大約 150 個)字元串的列表的最佳方法是什麼?
我將這個問題作為一般性問題向所有 Unix/Linux 專家提出,希望我能找到適合我的特殊情況的解決方案:我覺得這需要一些修補。
我在 IBM Unix System Services (USS) 機器上有一個大文本文件(實際上是一個 MVS 數據集)——我相信它在 6GB 左右。
我還有一個大約 150 個 5 字元標識符的列表,格式為 AAAAA,我需要在此文件中找到這些標識符 - 也就是說,我想從包含 150 個特定標識符中的任何一個的文件中提取行我在尋找。
大文件中每一行的格式為:
00000000000A00000000000000000AAAAA\n
其中 0 代表一個數字,A 代表一個字母數字字元。我正在搜尋的字元串始終位於行尾。
在 USS 中使用數據集似乎有點尷尬,我無法將其複製到 Unix 環境中,因為它太大了。標準的 Unix 實用程序並非都對數據集進行操作(例如 dd);然而 sed、awk 和 grep 似乎在某種程度上可以工作(儘管命令行開關似乎有點不同)。
我可以按如下方式 grep 數據集:
cat "//'MVS.DATASET'" | grep -e"LOOKFOR1" -e"LOOKFOR2" -e"LOOKFOR3" > output_to_file.txt
但是,它不允許我對一行中的所有 150 個項目進行 grep;我可以將它拆分並執行幾次,但我覺得應該有更好的方法。
我嘗試使用如下的 sed 腳本,但我根本不知道 sed,而且我收到一個錯誤,上面寫著“命令後的垃圾”。我將以下內容保存在文件 sed-script.txt 中:
s/AAA01/&/p s/AAA30/&/p s/AAA10/&/p ... etc ...
然後跑
sed -f sed-script.txt "//'MVS.DATASET'"
同樣,這失敗了“sed:命令後的FSUM7294垃圾”。
那麼,1. 通常如何在“普通”Unix 環境中解決這個問題,以及 2. 你對這個特殊情況有什麼具體的見解嗎?
grep
支持從文件-f
中獲取模式,如果您還指定固定字元串 ( ),效率會更高-F
:grep -F -f patterns.txt "//'MVS.DATASET'"
您可以先將 150 個 5 字元字元串的列表儲存在一個文件中,然後執行一個循環以獲取 grepping 模式 -
for i in `cat file` do cat mvsfile | grep -i $i >> matched_lines done