2015-04-06 113 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