Hợp nhất các dòng thay thế từ hai tệp


9

Tệp1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

Tệp2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

Tập tin đầu ra:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
Hãy luôn đề cập đến hệ điều hành của bạn. Rất nhiều công cụ tiêu chuẩn hoạt động khác nhau trên các HĐH khác nhau, vì vậy chúng tôi cần biết bạn đang sử dụng cái gì.
terdon

Câu trả lời:




5

Các pastegiải pháp là hầu hết các di động và hiệu quả nhất. Tôi chỉ đề cập đến phương án này trong trường hợp bạn thích hành vi của nó trong trường hợp hai tệp không có cùng số dòng:

Với GNU sed:

sed Rfile1 file2

Nếu file1có ít dòng hơn file2, khi file1hết, sedsẽ không xuất bất cứ thứ gì cho nó (trái ngược với dòng trống cho paste).

Nếu file1có nhiều dòng hơn file2, sau đó những dòng thêm sẽ bị loại bỏ (như trái ngược với in dòng trống cho file2với paste).

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

Sử dụng awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: chỉ NR==FNRđược khớp nếu số bản ghi hiện tại bằng với số bản ghi tệp hiện tại (do đó nó chỉ khớp trong khi xử lý tệp đầu tiên): lưu bản ghi hiện được xử lý vào mảng xở một chỉ mục bằng số bản ghi tệp hiện tại và bỏ qua kỷ lục hiện tại
  • {print x[FNR]"\n"$0}: in nội dung của mảng xtại một chỉ mục bằng với số bản ghi tệp hiện tại theo sau là một dòng mới và theo nội dung của bản ghi hiện tại
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

Nó cho đầu ra nhưng không chính xác như những gì tôi muốn. Các dòng tid.info đang đến sau các dòng tid.setnr trong tệp đầu ra của tôi.
pmaipmui

@Nainita Đó là những gì bạn đang thể hiện trong đầu ra ví dụ của mình.
kos

@Nainita Dù sao để chuyển đổi thứ tự đầu ra, bạn chỉ có thể chuyển đổi file1file2trong lệnh.
kos

Vâng ... tôi đã làm như vậy nhưng nó đã được in chính xác như trước đây. sau khi in tid.setnr thì nó đã được tid.info.
pmaipmui

1
@mikeerv Tuy nhiên, kể từ khi tôi ở đó, tôi mawkcũng đã thử và nó cũng chạy trên đó. Dù sao là hợp lý Tôi không thể hiểu tại sao nó không nên làm việc chỉ cách khác xung quanh (tức là chỉ bằng cách chuyển file). Nó không awkquan tâm đến đầu vào, dòng là dòng. Nếu thứ gì đó không được hỗ trợ bởi phiên bản của anh ta, nó sẽ bị hỏng lần đầu tiên. Cách dễ dàng hơn, đơn giản là OP đã mắc lỗi khi chuyển các tệp đầu vào trong các đối số.
kos

-1

Giải pháp đơn giản nhất được đưa ra dưới đây.

cat file1 >> file2

hoặc là

cat file2 >> file1

1
sachin, đọc lại câu hỏi; cái này nối thêm nội dung của một tệp vào nội dung của một tệp khác. Nó không hợp nhất các tệp xen kẽ các dòng (vì vậy một dòng từ file1đó đến một dòng từ file2đó ...)
don_crissti
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.