grep 模式和文件对

Pao*_*ini 4 linux grep

我有一个文件 (search.patterns),其中包含要搜索到其他 txt 文件列表中的模式列表。

搜索模式

home
dog 
cat
Run Code Online (Sandbox Code Playgroud)

文件 1.txt

home 3
tiger 4
lion 1
Run Code Online (Sandbox Code Playgroud)

文件 2.txt

dolphin 6
jaguar 3
dog 1
Run Code Online (Sandbox Code Playgroud)

文件 3.txt

donkey 3
cat 4
horse 1
Run Code Online (Sandbox Code Playgroud)

所以我想在file1中搜索模式文件的第一行,在file2中搜索第二行,在file3中搜索第三行

输出:

home 3
dog 1
cat 4
Run Code Online (Sandbox Code Playgroud)

我写了一些这样的代码:

for f in *.txt;
    do 
    while IFS= read -r LINE; 
        do grep -f "$LINE" "$f" > "$f.out"
    done < search.patterns
done
Run Code Online (Sandbox Code Playgroud)

但是,输出文件是空的

任何帮助,高度赞赏,谢谢

ste*_*ver 6

使用 GNU awk ( gawk),您可以使用BEGINFILE规则在每次输入文件更改时读取新模式:

$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Run Code Online (Sandbox Code Playgroud)

例如,您真的应该检查是否getline返回了新模式

gawk '
  BEGINFILE {
    if((getline pat < "search.patterns") <= 0) {
      print "Error reading pattern" > "/dev/stderr"
      exit 1
    }
  } 
  $0 ~ pat
' file\ {1..3}.txt
Run Code Online (Sandbox Code Playgroud)

需要注意的是awk模式扩展的正则表达式,类似于那些支持grep-E选项。

您可以awk通过search.patterns作为第一个文件传递NRFNR适当地使用和将模式读入索引数组,或查找数组中的下一个模式,从而在非 GNU 中实现相同的效果。


Kus*_*nda 5

使用bash

#!/bin/bash

files=( 'file 1.txt' 'file 2.txt' 'file 3.txt' )

while IFS= read -r pattern; do
    grep -e "$pattern" "${files[0]}"
    files=( "${files[@]:1}" )
done <search.patterns
Run Code Online (Sandbox Code Playgroud)

测试它:

$ bash script.sh
home 3
dog 1
cat 4
Run Code Online (Sandbox Code Playgroud)

该脚本将相关文件名保存在files数组中,然后继续从search.patterns文件中读取模式。对于每个模式,files查询列表中的第一个文件。然后从files列表中删除处理过的文件(在列表中产生一个新的第一个文件名)。

如果模式数超过 中的文件数files,则会出现错误grep