#linux
#linux
Вопрос:
У меня следующая структура папок:
/drive1/180204_somerandomtext/file.csv
/drive1/180504_somerandomtext/file.csv
/drive1/190101_somerandomtext/file.csv
/drive1/190305_somerandomtext/file.csv
...
Каждый file.txt имеет ту же структуру, но содержит разные данные. Из file.txt Я хочу извлечь только подмножество строк, используя следующую команду:
grep -A5000 -m1 -e 'Sample_ID,' /drive1/180204_somerandomtext/file.csv | tail -n 2
Эта команда работает и печатает следующие 5000 строк после строки, начинающейся с ‘Sample_ID,’
Я расширил эту команду
grep -A5000 -m1 -e 'Sample_ID,' /drive1/180204_somerandomtext/file.csv | tail -n 2 | sed 's/^/180204_somerandomtext,/'
Используя ‘sed’, я теперь добавляю в начало каждой строки шаблон ‘180204_somerandomtext’, который на самом деле является именем папки, содержащей файл.csv
Теперь я застрял на следующих шагах:
- как это сделать для всех файлов file.csv во вложенных папках drive1
- как сохранить этот результат в одном большом файле под названием «samples.csv»
Я пробовал что-то с xargs. Он работает с командой grep, но передача sed тогда не работает.
find /drive1/ -maxdepth 1 -name '1*' | cut -d '/' -f2 | xargs -I {} grep -A5000 -m1 -e 'Sample_ID,' /drive1/{}/file.csv | sed 's/^/{},/'
Комментарии:
1. Конвейер не будет работать, потому что тогда вы, по сути, выполняете
cat
. Поместите команду в скрипт bash, а затем используйтеfind
‘s-exec
для ее вызова для каждого найденного файла.
Ответ №1:
Я тоже не большой поклонник xargs
, я нахожу find -exec
гораздо более понятным использование, позвольте мне объяснить:
представьте, что я хотел бы что-то сделать с файлом file1.txt
:
Command -sw1 param1 -sw2 param2.1 param2.2 file1.txt
Запустите команду и используйте переключатели sw1
sw2
с параметрами param1
param2.1
и param2.2
.
Когда я хочу выполнить это для всех file1.txt
в структуре каталогов, я делаю следующее:
find . -name "file1.txt" -exec Command -sw1 param1 -sw2 param2.1 param2.2 {} ;
Поэтому я просто ввожу find
команду (с некоторой информацией о том, где и что нужно найти), а затем появляется -exec
. После этого -exec
я ввожу точную команду, где я заменяю свое исходное имя файла на {}
и завершаю все это ;
.
В вашем случае это было бы что-то вроде:
find /drive1 -name file.csv -exec grep -A5000 -m1 -e 'Sample_ID,' {} ;