grep文件匹配文件中grep的结果

时间:2015-04-06 13:52:19

标签: awk sed grep cut

我想做以下事情,但我今天似乎无法将我的大脑包裹起来......

我有一个部门编号,例如45.我有一个雇员数据文件,以雇员的部门编号结尾。所以,我可以抓住所有员工:

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

现在,返回如下内容。为简洁起见,我省略了多列数据。第一列是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,看看是否有什么事情开始有意义。

1 个答案:

答案 0 :(得分:1)

我会说

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

或可能

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

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

它的工作方式是

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

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