Назад | Перейти на главную страницу

Как добавить имя файла в качестве префикса в каждую строку текстового файла? (пакетная обработка; подкаталоги)

У меня есть много файлов .txt с разными датами имен файлов:

01.01.2010.txt
02.01.2010.txt
...

В настоящее время каждый файл (например, 01.01.2010.txt) выглядит так:

  0.351  XXX  XXX  XXX  XXX
  0.292  XXX  XXX  XXX  XXX  

Как мне добавить имя файла в каждую строку файла и сохранить формат?

... так это выглядит для файла 01.01.2010.txt:

  01.01.2010  0.341  XXX  XXX  XXX  XXX
  01.01.2010  0.122  XXX  XXX  XXX  XXX  

.. а для файла 02.01.2010.txt выглядит так:

  02.01.2010  0.391  XXX  XXX  XXX  XXX
  02.01.2010  1.342  XXX  XXX  XXX  XXX  

Эти файлы хранятся в подкаталогах. Если есть однострочник, который может обрабатывать их все, а также подкаталоги, было бы здорово.

- /patch/to/file
 -/path/to/file/sub1/
 -/path/to/file/sub2/
 -/path/to/file/sub3/

Ты можешь использовать:

grep -r . .

Первый . шаблон RegEx, соответствующий любому символу. Он будет соответствовать всем строкам.

Второй . для текущей папки, но вы можете заменить его любым допустимым путем. Например.:

grep -r . /etc/

Предложите использовать bash петли и sed. Например:

Создайте набор тестовых файлов:

$ for i in $(seq -w 1 10); do echo $i-content > $i.txt; done

Соберите команду замены:

$ for i in *.txt; do sed -i.bak s/^/$(basename $i .txt)\ /g $i; done

Совместите это с find:

for i in $(find /your/source/directory/ -iname "*.txt" -print)
do sed -i.bak s/^/$(basename $i .txt)\ /g $i; done

Это не было оптимизировано для производительности и, следовательно, вероятно, не самый эффективный способ выполнения запрошенной задачи.