如何在文件中查找来自文件的单词?

2 投票
8 回答
4648 浏览
提问于 2025-04-16 12:59

在一个文件中查找一个词是很简单的:

grep stuff file.txt

但是我有很多文件,每个文件的名字都在一个叫 files.txt 的文件里,而我想找的很多词也在另一个叫 words.txt 的文件里,每个词占一行。输出的结果应该是一个文件,每一行的格式是 a => b,其中 awords.txt 中的行号,bfiles.txt 中的行号。

我需要在 OSX 上运行这个,所以最好是用简单的 shell 脚本,但其他语言也可以。我自己对 shell 脚本不太熟悉,更习惯用一些不太适合字符串查找的语言(比如 C 语言 - 我猜 Perl 或 Python 可能会有帮助,但我没用过)。

8 个回答

1

这是一个关于awk的两部分内容:
1. 扫描files.txt中的每个文件,并将单词的编号与文件名对应起来。
2. 将文件名与files.txt中的行号对应起来。

awk '
  NR == FNR {word[$1] = NR; next}
  {for (i=1; i<=NF; i++) {if ($i in word) {print word[$i] " => " FILENAME; break}}}
' words.txt $(<files.txt) | 
sort -u |
awk '
  NR == FNR {filenum[$1] = NR; next}
  {$3 = filenum[$3]; print}
' files.txt -
1

首先,学会指定你感兴趣的文件。是一个文件夹还是多个文件夹?Unix系统中的find工具可以帮你完成这个任务。

在Bash提示符下,你可以输入:

$ cd [the root directory where your files are]
$ find . -name "*.txt"

你没有说明,但可以假设这些文件的命名方式是“星号.某种后缀”,这样find就能找到这些文件。

接下来,把找到的文件名传递给你想对它们做的操作:

$ find . -name "*.txt" -print0 | xargs -0 egrep 'stuff'

这将对每个文件运行egrep,并使用stuff作为搜索模式。

你可以在谷歌上搜索findxargs,会找到成千上万的例子。一旦你熟悉了如何找到文件,重新表述一下你的问题,让人更容易理解你想对这些文件做什么。然后我可以帮你用Perl来实现。

1

你可能会觉得这样做更快、更符合Python的风格,而且更容易理解:

with open("words.txt") as words:
    wlist=[(ln,word.strip()) for ln,word in enumerate(words,1)]

with open("files.txt") as files:
    flist=[(ln,file.strip()) for ln,file in enumerate(files,1)]

for filenum, filename in flist:
    with open(filename) as fdata:
        for fln,line in enumerate(fdata,1):
            for wln, word in wlist:
                if word in line:
                    print "%d => %d" % (wln, fln)

撰写回答