在大型文本文件中查找多个字符串列表的最佳方法是什么

在大型文本文件中查找多个字符串列表的最佳方法是什么

简短而普遍的问题是:在 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

但是,它不允许我在一行中 grep 查找所有 150 个项目;我可以将其拆分并运行几次,但我觉得应该有更好的方法。

我尝试使用 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. 您对这一特定案例有什么具体的见解吗?

答案1

grep支持从文件中获取模式-f,如果还指定固定字符串 ( -F),效率会更高:

grep -F -f patterns.txt "//'MVS.DATASET'"

答案2

您可以先将 150 个 5 字符字符串的列表存储在一个文件中,然后运行一个循环来查找模式 -

for i in `cat file`
do
cat mvsfile | grep -i $i >> matched_lines
done

相关内容