Объединить содержимое TXT-файла и / или добавить разрыв для всех - PullRequest
3 голосов
/ 20 января 2012

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 24 января 2012

Самый простой способ добиться этого - воспользоваться циклом bash for:

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

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

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

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


Альтернативным способом является использование sed:

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

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

2 голосов
/ 24 января 2012

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

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)
...