Объединение файлов и вставка новой строки между файлами
У меня есть несколько файлов, которые я хочу выполнить с помощью 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