Объединение файлов и вставка новой строки между файлами - PullRequest
103 голосов
/ 18 ноября 2011

У меня есть несколько файлов, которые я хочу объединить с cat. Допустим,

File1.txt 
foo

File2.txt
bar

File3.txt
qux

Я хочу объединить, чтобы конечный файл выглядел следующим образом:

foo

bar

qux

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

foo
bar 
qux

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

Ответы [ 7 ]

94 голосов
/ 18 ноября 2011

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

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

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

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

awk 'FNR==1{print ""}1' *.txt > finalfile.txt
37 голосов
/ 08 мая 2014

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

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt
32 голосов
/ 18 ноября 2011

Если бы я делал это, я бы использовал 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
7 голосов
/ 21 июня 2017

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

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt
7 голосов
/ 10 ноября 2016

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

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

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

Примеры:

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

Вот как я только что сделал это в OsX 10.10.3

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

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

2 голосов
/ 10 ноября 2016

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