Shell

在大型文本文件中查找多個字元串列表的最佳方法是什麼

  • November 5, 2013

簡短而普遍的問題是:在 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

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