kết hợp hai tập tin văn bản với việc thêm một số dấu phân cách giữa?


16

cat file1 file2sẽ kết hợp hai tệp văn bản. Nhưng nếu tôi muốn thêm một số dấu phân cách giữa, như một hoặc hai dòng ********************************, tôi có phải mở tệp đầu tiên và thêm dòng ở cuối hoặc mở tệp thứ hai và thêm dòng ở đầu của nó, sau đó chạy các catlệnh? Nó có thể được thực hiện chỉ với việc chạy một lệnh?

Câu trả lời:


17

Trong bashzshbạn có thể làm:

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

hoặc như mikeerv chỉ ra trong nhận xét của mình (trong bất kỳ vỏ nào):

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

và trong Bash như David Z đã nhận xét:

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

Bất kỳ dòng mới trong các tập tin sẽ được hiển thị. Nếu bạn không muốn một dòng mới sau "dấu phân cách" (ví dụ trong trường hợp file2bắt đầu bằng một dòng mới), bạn có thể sử dụng echo -n '****', vì vậy hãy loại bỏ dòng mới sau *.


7
bạn có thể làm điều tương tự trong bất kỳ shell nào nhưecho '**********************' |cat file - file2
mikeerv

cảm ơn. mèo luôn luôn thêm một dòng mới giữa các tập tin, ngầm?
StackExchange cho tất cả

1
@Tim - chắc chắn echoluôn luôn như vậy.
mikeerv

1
@Tim - không nhìn theo cách đó ở đây, nhưng hãy tự mình xem -printf 'no newline' | tee file1 >file2; printf 'no newline' | cat file1 - file2
mikeerv

1
@Tim bạn có thể sử dụng ...<(echo -n '****')để chặn dòng mới khỏi tiếng vang. catchỉ hiển thị một khi tệp có một (ở cuối).
Anthon

6

Một cách tiếp cận khác mà không sử dụng catnhư được tìm thấy từ đây ,

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

sed 1dỐng cuối cùng là loại bỏ dòng đầu tiên cũng sẽ có dấu phân cách.

Tuy nhiên, việc sedsử dụng cuối cùng rất có thể tránh được nếu chúng ta sử dụng lệnh như được đề xuất bởi 1_CR trong các bình luận của mình.

awk 'FNR==1 && NR!=1 {print "******"}{print}' file1 file2

1
bạn có thể tránh sedbằng cách thay đổi awkmẫu thànhFNR == 1 && NR != 1
iruvar

Chúc mừng bạn đã đạt 10K!
G-Man nói 'Phục hồi Monica'

@ G-Man, cảm ơn rất nhiều. Thật tuyệt khi bạn chúc mừng :)
Ramesh

Điều này cho phép dễ dàng mở rộng regex của các mẫu tệp
Paul

3

Bạn cũng có thể chia nó thành nhiều lệnh:

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

Và bạn có thể chuyển hướng hoặc chuyển hướng bằng cách sử dụng lệnh nhóm hoặc lớp con:

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

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

Tất nhiên, bạn có thể viết nó qua nhiều dòng thay vì sử dụng dấu chấm phẩy, như bình thường. Và thật dễ dàng để mở rộng sang một tệp khác với một dấu phân cách khác, v.v.


2

Với paste:

$ echo '********************************' | paste -sd$'\n' file1 - file2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.