объединить два текстовых файла с добавлением разделителя между ними?

16

cat file1 file2объединит два текстовых файла. Но если я хочу добавить какой-то разделитель, например, одну или две строки ********************************, мне нужно открыть первый файл и добавить строку в его конце, или открыть второй файл и добавить строку вверху, а затем запустить catкоманда? Это можно сделать, просто запустив команду?

StackExchange для всех
источник

Ответы:

17

В bashи zshвы можете сделать:

cat file1 <(echo '********************************') file2

или как mikeserv указал в своем комментарии (в любой оболочке):

echo '********************************' | cat file1 - file2

и в Bash, как сказал Дэвид Z:

cat file1 - file2 <<< '********************************'

Любые новые строки в файлах будут показаны. Если вы не хотите использовать новую строку после «разделителя» (например, в случае, если file2начинается с новой строки), вы можете использовать ее echo -n '****', поэтому подавляйте новую строку после *.

Энтон
источник
7
Вы можете сделать то же самое в любой оболочке, какecho '**********************' |cat file - file2
Mikeserv
Благодарю. всегда ли cat добавляет новую строку между файлами, неявно?
StackExchange для всех
1
@ Тим - определенно echoвсегда так.
mikeserv
1
@ Тим - здесь не так, но посмотрите самиprintf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv
1
@Tim вы можете использовать ...<(echo -n '****')для подавления перевода строки из эха. catпоказывает только один, когда файл имеет один (в конце).
Энтон
6

Другой подход без использования, catнайденный здесь ,

awk 'FNR==1{print "******"}{print}' file1 file2 | sed '1d'

Последняя sed 1dтруба должна удалить первую строку, которая также будет иметь разделитель.

Однако окончательного sedиспользования вполне можно избежать, если мы используем команду, предложенную 1_CR в его комментариях.

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2
Рамеш
источник
1
Вы можете избежать этого sed, изменив awkсхему наFNR == 1 && NR != 1
iruvar
Поздравляем с достижением 10K!
G-Man говорит: «Восстановите Монику»
@ G-Man, спасибо большое. Это так мило с вашей стороны, чтобы поздравить :)
Рамеш
Это позволяет легко расширять регулярные выражения шаблонов файлов
Paul
3

Вы также можете разделить его на несколько команд:

cat file1; echo '------------'; cat file2

И вы можете передать или перенаправить это с помощью групповой команды или подоболочки:

# GROUP COMMAND:
{ cat file1; echo '----------'; cat file2; } | other-command
#                                        ^ final semicolon is part of the syntax!

# SUBSHELL:
( cat file1; echo '----------'; cat file2 ) | other-command

Конечно, вы можете написать это в несколько строк вместо использования точек с запятой, как обычно. И его легко распространить на другой файл с другим разделителем и т. Д.

derobert
источник
2

С paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
cuonglm
источник