linux объединяет только подмножество строк из нескольких файлов

#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,' {} ;