menggabungkan dua file teks dengan menambahkan beberapa pemisah antara?

16

cat file1 file2akan menggabungkan dua file teks. Tetapi jika saya ingin menambahkan beberapa pemisah antara, seperti satu atau dua baris ********************************, apakah saya harus membuka file pertama, dan menambahkan baris di ujungnya, atau membuka file kedua dan menambahkan baris di bagian atas, dan kemudian jalankan yang catperintah? Bisakah itu dilakukan dengan hanya menjalankan perintah?

StackExchange untuk Semua
sumber

Jawaban:

17

Di bashdan zshAnda dapat melakukan:

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

atau seperti yang ditunjukkan mikeserv dalam komentarnya (dalam shell apa pun):

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

dan di Bash ketika David Z berkomentar:

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

Setiap baris baru dalam file akan ditampilkan. Jika Anda tidak ingin baris baru setelah "separator" (misalnya dalam kasus file2dimulai dengan baris baru), Anda dapat menggunakan echo -n '****', jadi tekan baris baru setelah *.

Anthon
sumber
7
Anda dapat melakukan hal yang sama di shell sepertiecho '**********************' |cat file - file2
mikeserv
Terima kasih. apakah cat selalu menambahkan baris baru di antara file, secara implisit?
StackExchange for All
1
@ Tim - pasti echoselalu begitu.
mikeserv
1
@Tim - tidak terlihat seperti itu di sini, tetapi lihat sendiri -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeserv
1
@Tim yang dapat Anda gunakan ...<(echo -n '****')untuk menekan baris baru dari gema. cathanya menampilkan satu ketika file memiliki satu (di akhir).
Anthon
6

Pendekatan lain tanpa menggunakan catseperti yang ditemukan dari sini ,

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

Akhir sed 1dPipa adalah untuk menghapus baris pertama yang juga akan memiliki pembatas.

Namun penggunaan akhir sedbisa sangat dihindari jika kita menggunakan perintah seperti yang disarankan oleh 1_CR dalam komentarnya.

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2
Ramesh
sumber
1
Anda dapat menghindari seddengan mengubah awkpola keFNR == 1 && NR != 1
iruvar
Selamat telah mencapai 10K!
G-Man Mengatakan 'Reinstate Monica'
@ G-Man, terima kasih banyak. Itu sangat baik dari Anda untuk melakukan congragulasi :)
Ramesh
Ini memungkinkan ekstensi mudah untuk regex pola file
Paul
3

Anda juga dapat membaginya menjadi beberapa perintah:

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

Dan Anda dapat mem-pipe atau mengarahkan ulang yang menggunakan perintah grup atau subkulit:

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

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

Tentu saja, Anda dapat menulisnya di beberapa baris alih-alih menggunakan titik koma, seperti biasa. Dan mudah untuk memperluas ke file lain dengan pembatas lain, dll.

derobert
sumber
2

Dengan paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
cuonglm
sumber