2015-04-06 92 views
0

我想做到以下几点,但我似乎没有今天能够环绕它我的大脑......grep的文件从一个文件匹配的grep的结果

我有段数,例如为45.我有一个员工数据文件,以员工的章节号结尾。所以,我可以抓住所有员工:

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

现在,返回类似下面的内容。为简洁起见,我省略了多列数据。第一列是ID。最后是部分编号。

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

现在,在硬的部分...在/数据是一组目录。每个目录名为p ####,其中####是员工编号。这些目录的内部是一组文件。我对/data/p####/contacts.csv感兴趣。我有一个关键值(在本例中为“Bob”),我希望在previous grep的每个员工的contacts.csv文件中找到包含关键值的每一行。我不想亲手做这件事,因为在实际工作中,我将从每个grep中收到几千个结果。

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

在我看来,我应该可以到grep对文件名的模式,但后来我不得不废话第一的grep在为图案 - 我不认为我能做到。如果唯一的好办法是编写一个脚本来完成这一切,我会这样做。现在,我搞砸了sed和awk,看看有没有什么开始有意义的。

回答

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) 

,如果你不想在那里鲍勃发现作为输出的部分文件名。

它的工作方式是,

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

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

+0

这是正确的,但缺少一半的答案。您必须将原始grep输入到上面的答案中,如下所示:'grep“,45 $”/data/employees.dat | grep Bob $(awk -F,'$ NF == 45 {print“/ data/p”$ 1“/contacts.csv”}')' – kainaw 2015-04-07 13:58:48

+0

啊。不,我只是在awk命令中忘记了文件名 - 它已经选择了。我编辑过;我的错。 – Wintermute 2015-04-07 14:09:54