我有一个文件(search.patterns),其中包含要搜索到其他 txt 文件列表中的模式列表。
搜索模式
home
dog
cat
文件 1.txt
home 3
tiger 4
lion 1
文件 2.txt
dolphin 6
jaguar 3
dog 1
文件 3.txt
donkey 3
cat 4
horse 1
所以我希望在file1中搜索模式文件的第一行,在file2中搜索第二行,在file3中搜索第三行
输出:
home 3
dog 1
cat 4
我写了一些这样的代码:
for f in *.txt;
do
while IFS= read -r LINE;
do grep -f "$LINE" "$f" > "$f.out"
done < search.patterns
done
但是,输出文件是空的
任何帮助,非常感谢,谢谢
使用 GNU awk (
gawk
),您可以使用BEGINFILE
规则在每次输入文件更改时读取新模式:你真的应该检查
getline
返回一个新的模式,例如请注意,
awk
模式是扩展的正则表达式,类似于选项支持的grep
那些-E
。awk
您可以通过search.patterns
作为第一个文件传递并使用NR
并FNR
适当地将模式读入索引数组或查找数组中的下一个模式来在非 GNU 中实现相同的目的。使用
bash
:测试它:
该脚本将相关文件名保存在
files
数组中,然后继续从search.patterns
文件中读取模式。对于每个模式,files
查询列表中的第一个文件。然后从files
列表中删除已处理的文件(在列表中产生新的第一个文件名)。如果模式数超过 中的文件数
files
,则会出现错误grep
。您可以使用
paste
将模式与文件匹配:我假设文件名不包含制表符。