如何在文件中查找来自文件的单词?
在一个文件中查找一个词是很简单的:
grep stuff file.txt
但是我有很多文件,每个文件的名字都在一个叫 files.txt
的文件里,而我想找的很多词也在另一个叫 words.txt
的文件里,每个词占一行。输出的结果应该是一个文件,每一行的格式是 a => b
,其中 a
是 words.txt
中的行号,b
是 files.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
作为搜索模式。
你可以在谷歌上搜索find
和xargs
,会找到成千上万的例子。一旦你熟悉了如何找到文件,重新表述一下你的问题,让人更容易理解你想对这些文件做什么。然后我可以帮你用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)