0

我正在编写一个 awk 脚本,我想在文件中搜索一些字符串。我面临的问题是......

从某种意义上说,该文件非常庞大。大约 100 万行。

如果我搜索文件最后一行存在的字符串,那么我不必要地遍历了开头行的其余部分,因此我正在寻找一些命令,当我将字符串作为参数时,它应该给我文件的行号..或者我想对文件进行二进制搜索,任何关于此的重定向。

只是附加说明,字符串不是单个字符串,我有多个字符串要在一个时间点搜索

4

3 回答 3

1

无论您做什么,如果数据在文件中,则必须先将其读入内存,然后才能进行任何处理(无论效率如何)、排序、搜索等。

您是内存不足,还是担心时间?如果内存不是问题,那么如今 100 万条记录似乎并没有那么大。

如果您只想确定数据文件中是否存在某个字符串,您可以尝试使用grep. 例如,

 grep -n target_string data.txt

如果在文件中找到目标,将打印行和行号。有关grep 手册页的更多信息。

如果您想定位然后处理文件中的一行,那么grep将无法正常工作,您必须使用awk(如您所提到的),或者查看sed或用 Python 或其他语言编写自定义脚本。在所有情况下,都必须以一种或另一种方式读取文件。

也许将文件分成块然后处理特定部分(如果您可以提前确定要搜索的位置 - 尽管从您的问题听起来不太可能)

于 2012-07-18T12:02:30.523 回答
0

你有一百万行,但文件有多大?100 万行 1 个字符的文件大小约为 1MB,这很小,而且在时间方面不会花时间来解析。80 个字符/行给出的文件大小为 76MB,这将比 1 个字符/行文件花费更多的时间来读取,但对于简单的查找来说,时间不会很可怕。

如果您正在查看许多兆字节,那么您需要读取文件一次并为其创建索引,但是如果这是一次性或罕见的任务,则创建此类索引所花费的时间不会超过成本使用grep或直接对文件进行搜索awk

同样,如果您需要对不断变化的文件执行此操作,那么再次拥有索引不会给您带来太多好处,因为索引将过时并且您需要刷新索引(需要重新扫描整个文件)以获得准确的结果。

我们需要更多关于总体问题的详细信息,因为听起来还有一些其他的不清楚的要求:您多久进行一次此搜索?文件的静态程度如何?你如何处理结果?简而言之,您这样做是为了什么需求/应用?

也就是说,如果您想创建索引,那么只需逐行读取文件,在空白处拆分,然后将单词与行一起存储在某个数据存储区(SQLite 数据库?BDB 数据库?)它出现在,然后直接查询该商店。希望您可以看到初始生成非常昂贵,因此仅当文件是静态的并且您正在对文件进行多次搜索时才值得这样做。

于 2012-07-18T12:14:37.323 回答
0

您提到对文件进行二进制搜索,因此我们可以假设您的输入已排序,并且您要查找的字符串锚定到行首。要进行二分搜索,有一个名为 的实用程序look,但它不报告行号。要获取行号,只需将行号附加到输入:

# Append line numbers to each line
$ awk '{print $0, NR}' input > tmp   

# Do a binary search, looking for the string 'string'
$ look string tmp 

look并且seq不是标准实用程序,因此可能无法在您的平台上使用。

于 2012-07-18T14:10:34.357 回答