Grep files 匹配 grep from a file 的结果

Grep files matching result of grep from a file

我想做以下事情,但我今天似乎无法解决这个问题...

我有一个部门编号,例如 45。我有一个以员工部门编号结尾的员工数据文件。所以,我可以通过以下方式获取所有员工:

grep ",45$" /data/employees.dat

现在,returns 类似于以下内容。为了简洁起见,我省略了多列数据。第一列是 ID。最后是节号。

38275,...some data...,45
4718573,...some data...,45
328,...some data...,45

现在,进入困难的部分... /data 中是一组目录。每个目录都命名为 p####,其中 #### 是员工编号。这些目录中有一组文件。我对 /data/p####/contacts.csv 感兴趣。我有一个键值(在此示例中为 "Bob"),我想在 contacts.csv 文件中为前一个 grep 的每个员工找到包含该键值的每一行。我不想手动执行此操作,因为在实际工作中,我会从每个 grep 中收到几千个结果。

grep Bob /data/p38275/contacts.csv
grep Bob /data/p4718573/contacts.csv
grep Bob /data/p328/contacts.csv

在我看来,我应该能够在文件名的模式上进行 grep,但随后我不得不将第一个 grep 作为模式进行废话 - 我认为我做不到。如果唯一好的解决方案是编写一个脚本来手动完成这一切,我会这样做。现在,我正在使用 sed 和 awk 看看是否有任何意义。

我会说

grep Bob $(awk -F, '$NF == 45 { print "/data/p"  "/contacts.csv" }' /data/employees.txt)

或者可能

grep -h Bob $(awk -F, '$NF == 45 { print "/data/p"  "/contacts.csv" }' /data/employees.txt)

如果您不想将找到 Bob 的文件名作为输出的一部分。

它的工作方式是

awk -F, '$NF == 45 { print "/data/p"  "/contacts.csv" }' /data/employees.txt

打印文件名列表(由第一个字段和最后一个字段为 45 的字符串常量构建),然后作为参数传递给 grep(这就是 $() 命令替换是为了)。 请注意,这预计字段中没有空格,尽管我无法想象有,给定示例输入数据。