Объединение файлов и вставка новой строки между файлами

У меня есть несколько файлов, которые я хочу выполнить с помощью cat. Пусть говорят

File1.txt 
foo

File2.txt
bar

File3.txt
qux

Я хочу, чтобы concat так, чтобы конечный файл выглядел так:

foo

bar

qux

Вместо этого с обычным cat File*.txt > finalfile.txt

foo
bar 
qux

Какой правильный способ сделать это?

Ответ 1

Вы можете сделать:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

Убедитесь, что файл finalfile.txt не существует, прежде чем запускать указанную выше команду.

Если вам разрешено использовать awk, вы можете сделать:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt

Ответ 2

Если у вас мало файлов, которые вы можете перечислить, вы можете использовать замену процессов в Bash, вставив новую строку между каждой парой файлов:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

Ответ 3

Если бы я это делал, я бы использовал sed:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

В этом шаблоне sed $имеет два значения, во-первых, он соответствует только последнему номеру строки (как диапазон строк для применения шаблона), а во-вторых, он соответствует концу строки в шаблоне замещения.

Если ваша версия sed не имеет -s (файлы ввода процесса отдельно), вы можете сделать все это как цикл:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

Ответ 4

Как я это делал на OsX 10.10.3

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

поскольку простая команда "echo" без каких-либо параметров не вставлена ​​в новые строки.

Ответ 5

Это работает в Bash:

for f in *.txt; do cat $f; echo; done

В отличие от ответов >> (append), вывод этой команды может быть передан в другие программы.

Примеры:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (parens необязательны)
  • for ... done | less (меньше в трубопроводе)
  • for ... done | head -n -1 (это удаляет конечную пустую строку)

Ответ 6

В python это объединяется с пустыми строками между файлами (, подавляет добавление дополнительной завершающей пустой строки):

print '\n'.join(open(f).read() for f in filenames),

Вот уродливый однострочный python, который можно вызывать из оболочки и печатает вывод в файл:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt

Ответ 7

Вы можете сделать это, используя xargs, если хотите, но основная идея остается прежней:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt