我想做以下事情,但我今天似乎无法将我的大脑包裹起来......
我有一个部门编号,例如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,看看是否有什么事情开始有意义。
答案 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
(这就是$()
命令替换是为了)。 请注意,这需要字段中没有空格,尽管我无法想象给定示例输入数据。