2015-04-06 3 views
0

Я хотел бы сделать следующее, но не похоже, чтобы быть в состоянии обернуть мой мозг вокруг него сегодня ...Grep файлы, соответствующие результаты Grep из файла

У меня есть номер раздела, например как 45. У меня есть файл данных сотрудников, который заканчивается номером раздела сотрудника. Таким образом, я могу захватить всех сотрудников с помощью:

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

Теперь это возвращает что-то вроде следующего. Для краткости я опустил несколько столбцов данных. Первый столбец - это идентификатор. Последний номер раздела.

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

Теперь, на твердую часть ... В/data - набор каталогов. Каждый каталог имеет имя p ####, где #### - номер сотрудника. Внутри этих каталогов находится набор файлов. Меня интересует /data/p####/contacts.csv. У меня есть ключевое значение («Боб» в этом примере), и я хочу найти каждую строку, содержащую значение ключа в файле 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

Я бы сказал, что

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

+0

Ah. Нет, я просто забыл имя файла в команде awk - он уже выбирает. Я редактировал это; моя вина. – Wintermute

Смежные вопросы