Làm cách nào tôi có thể sao chép nội dung của tệp văn bản và dán nó vào một tệp khác bắt đầu từ một dòng nhất định?


12

Tôi cần sao chép nội dung của tệp văn bản và dán nó vào tệp văn bản khác. Tệp văn bản đầu tiên có 10 dòng dữ liệu và tôi cần sao chép chúng vào tệp văn bản thứ hai bắt đầu từ dòng số 5 (ví dụ). Vì vậy, trong tệp văn bản thứ hai, những dữ liệu đó nên được ghi từ dòng 5 đến dòng 14. Làm thế nào điều này có thể được thực hiện? Cảm ơn trước. Hãy coi tôi như một tân binh liên quan đến Linux.

Câu trả lời:


9

headtailgiải pháp

Giả sử tệp nguồn được gọi ~/avà tệp được chèn sẽ được gọi ~/b. Chúng tôi sẽ đặt tệp đã hợp nhất vào ~/c:

head -n 5 ~/a > ~/c
cat ~/b >> ~/c
tail --lines=+6 ~/a >> ~/c
  • Đường dẫn ~/là tay ngắn cho /home/usertên thư mục của bạn
  • head sao chép năm dòng đầu tiên của tập tin avào tập tin mới được tạoc
  • mèo liệt kê nội dung của tập tin bvà nối nó vào tập tinc
  • đuôi nối thêm tập tin abắt đầu từ dòng 6 cho đến khi kết thúc tập tinc

Sau khi xác minh đổi tên tập tin hợp nhất

Sau khi xác minh rằng tệp cđược hợp nhất chính xác từ các tệp abchúng tôi sẽ đổi tên cthành a:

mv ~/c ~/a
  • mvdi chuyển tập tin cvào tập tin a. Dữ liệu không được di chuyển. Các tập tin chỉ được đổi tên mà tiết kiệm thời gian.

Cảm ơn về câu trả lời của bạn. Nó hoạt động tốt. Tuy nhiên, có một cách khác để làm điều này mà không cần sử dụng tệp văn bản thứ ba?
G. Paschalis

Tệp thứ ba có thể được đổi tên thành tệp nguồn khi hoàn tất. Tôi nghĩ rằng tốt nhất để có thể xem các tập tin đầu tiên. Tôi sẽ thêm các bước bổ sung cho câu trả lời ngay bây giờ.
WinEunuuchs2Unix

Hoặc ...(head -n 5 a.txt ; cat b.txt ; tail -n +6 a.txt) > c.txt

1
@JJoao Đó là một bản tóm tắt một dòng hay :) Đối với mục đích giảng dạy, tôi thích sử dụng một dòng trên mỗi phương thức lệnh và các câu lệnh if lồng nhau. Tuy nhiên để sao chép và dán vào thiết bị đầu cuối, tôi yêu các lớp lót!
WinEunuuchs2Unix

16

Công cụ đơn giản nhất ở đây có thể là sed. Để chèn b.txtvào a.txtsau dòng thứ 5, bạn có thể viết:

sed '5r b.txt' a.txt

sedđọc tệp được chỉ định là đối số ( a.txt) theo từng dòng. Tất cả các dòng được sao chép trong đầu ra giống như chúng xuất hiện trong đầu vào, trừ khi chúng bị thay đổi bởi một lệnh.

Đây 5là một địa chỉ (số dòng) mà tại đó lệnh sau sẽ được thực thi. Lệnh chúng ta sử dụng là r, lấy tên tệp làm đối số (ở đây b.txt), đọc nó hoàn toàn và chèn nó vào đầu ra sau dòng hiện tại.

Vì nó đứng ở trên, seddòng lệnh này sẽ chỉ in đầu ra ra thiết bị đầu cuối, mà không ghi vào bất kỳ tệp nào. Bạn có thể chuyển hướng nó đến một tệp mới (không phải bất kỳ tệp đầu vào nào!) Bằng cách sử dụng chuyển hướng đầu ra của Bash:

sed '5r b.txt' a.txt > c.txt

Hoặc bạn có thể trực tiếp chỉnh sửa các tập tin đầu vào bên ngoài a.txtbằng cách sử dụng sed's -i(đối với 'tại chỗ') switch. Nếu bạn viết nó dưới dạng -i.bak, nó sẽ tạo một bản sao lưu của tệp đầu vào ban đầu với hậu tố .baktrước:

sed -i '5r b.txt' a.txt

Một ví dụ:

$ cat a.txt 
January
February
March
April
May
October
November
December

$ cat b.txt 
June
July
August
September

$ sed '5r b.txt' a.txt
January
February
March
April
May
June
July
August
September
October
November
December

0

(Sử dụng lại ví dụ thanh lịch từ @ByteCommander :)

awk '1; NR==5 {system("cat b.txt")}' a.txt
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.