2012-01-20 1 views
3

У меня есть файл cunch.txt, который нужно сделать в один большой файл, который может быть прочитан такими программами, как Microsoft Excel.Конкатенация содержимого файла txt и/или добавление перерыва для всех

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

Вот пример того, что у меня есть (номера представляют собой номер строки):

1. | first line of txt file 
2. | second line 

Вот что я хочу, чтобы превратить это в:

1. | first line of txt file 
2. | second line 
3. | 

У меня есть около 3000 из этих файлов в папке, все в том же формате. Есть ли способ взять эти файлы и добавить пустую строку до конца? Я бы хотел сделать это без необходимости сложного кода, то есть PHP и т. Д. Я знаю, что есть похожие вещи, которые вы можете использовать с помощью терминала (я на CentOS), но если что-то делает конкретно то, что мне нужно, m не хватает.

+3

Ваше форматирование сбивает с толку - вы говорите, что это одна строка, но затем показывают многострочный пример. Кроме того, вы уже пробовали регулярное выражение? – Chris

ответ

4

Самый простой способ добиться этого с Баш для цикла:

for file in *.txt; do 
    echo >> "$file" 
done 

Это итерацию над всеми .txt файлами в текущем каталоге и добавляет новую строку для каждого файла. Его можно записать в одну строку, вам нужно только добавить ; до done.

Отметьте, что $file цитируется для обработки файлов с пробелами и другими забавными символами в их именах.

Если файлы разбросаны во многих каталогах и не все в том же самом, вы можете заменить *.txt с **/*.txt перебрать все .txt файлы во всех подкаталогах текущей папки.


Альтернативный способ заключается в использовании sed:

sed -i "$ s:$:\n:" *.txt 

Флаг -i говорит sed редактировать файлы на месте. $ соответствует последней строке, а затем команда s заменяет конец строки (опять $) новой строкой (\n), тем самым добавляя строку в конец файла.

2

Попробуйте этот фрагмент:

for f in *; do ((cat $f && echo "") > $f.tmp) done && rename -f 's/\.tmp$//' *.tmp 
  • Это в основном принимает любой файл в папке (for f in *; do).
  • Выводит файл на STDOUT (cat $f) с последующим переводом строки (echo "")
  • и перенаправляет вывод в filename.tmp (> $f.tmp)
  • , а затем перемещает *.tmp файлы исходных файлов (rename -f 's/\.tmp$//' *.tmp).

Edit: Или еще проще:

for f in *; do (echo "" >> $f) done 
  • Это в основном принимает любой файл в папке (for f in *; do).
  • Выводит символ новой строки (echo "")
  • и добавляет его в файл (>> $f)