2010-03-19 44 views
105

Tôi cần nối một số tệp văn bản tương đối lớn và muốn thực hiện điều này thông qua dòng lệnh. Rất tiếc, tôi chỉ có Windows và không thể cài đặt phần mềm mới.Nối các tệp văn bản với dòng lệnh của Windows, thả các dòng đầu tiên

type file1.txt file2.txt > out.txt 

cho phép tôi gần như nhận được những gì tôi muốn, nhưng tôi không muốn dòng đầu tiên của file2.txt được đưa vào out.txt.

Tôi nhận thấy rằng more có tùy chọn +n để chỉ định dòng bắt đầu, nhưng tôi chưa quản lý kết hợp các kết quả này để có được kết quả tôi muốn. Tôi biết rằng điều này có thể không thực hiện được trong Windows và tôi luôn có thể chỉnh sửa out.txt bằng tay để loại bỏ dòng, nhưng có cách đơn giản để thực hiện nó từ dòng lệnh không?

Trả lời

118
more +2 file2.txt > temp 
type temp file1.txt > out.txt 

hoặc bạn có thể sử dụng copy. Xem copy /? để biết thêm.

copy /b temp+file1.txt out.txt 
+1

Dĩ nhiên! Tôi đã có thể ưa thích để tránh việc sử dụng các tập tin tạm thời mặc dù. Tôi cố gắng sử dụng dấu ngoặc đơn, đường ống và <để đưa nó vào một lệnh, nhưng không thể đi đến đâu cả. Lệnh 'copy' nhanh hơn nhiều, nhưng nó đặt ký tự SUB ở cuối. Có cách nào để tránh điều này không? – James

+10

có, bạn đặt '/ b'. xem chỉnh sửa – ghostdog74

+7

Tôi sẽ thêm rằng nếu bạn muốn nối tất cả các tệp bạn có thể thực hiện 'copy/b * .txt combined.txt' mà không cần phải liệt kê các tệp riêng lẻ. – Phlucious

6

Sử dụng các lệnh FOR để echo một dòng tập tin bằng cách dòng, và với sự 'bỏ qua' tùy chọn để bỏ lỡ một số dòng bắt đầu ...

FOR /F "skip=1" %i in (file2.txt) do @echo %i 

Bạn có thể chuyển hướng đầu ra của một tệp hàng loạt, có chứa một cái gì đó như ...

FOR /F %%i in (file1.txt) do @echo %%i 
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i 

Lưu ý rằng đôi khi biến FOR được sử dụng trong một tệp lô.

2

Tôi biết bạn đã nói rằng bạn không thể cài đặt bất kỳ phần mềm nào, nhưng tôi không chắc chắn mức độ hạn chế đó là bao nhiêu. Dù sao, tôi đã có cùng một vấn đề (cố gắng ghép hai tập tin với có lẽ là cùng một tiêu đề) và tôi nghĩ rằng tôi sẽ cung cấp một câu trả lời thay thế cho những người khác đến trang này, vì nó làm việc chỉ tuyệt vời cho tôi.

Sau khi thử toàn bộ các lệnh trong cửa sổ và bị thất vọng nặng nề, đồng thời thử tất cả các trình soạn thảo đồ họa hứa hẹn có thể mở các tệp lớn, nhưng sau đó không thể, cuối cùng tôi đã trở về nguồn gốc Linux của mình và mở dấu nhắc Cygwin của tôi. Hai lệnh:

cp file1.csv out.csv 
tail -n+2 file2.csv >> out.csv 

Đối file1.csv 800MB và 400MB file2.csv, hai lệnh mất dưới 5 giây trên máy tính của tôi. Trong dấu nhắc Cygwin, không kém. Tôi nghĩ các lệnh Linux được cho là chậm chạp trong Cygwin nhưng cách tiếp cận đó tốn ít công sức hơn và dễ dàng hơn mọi cách tiếp cận cửa sổ mà tôi có thể tìm thấy.

55

tôi sử dụng này, và nó hoạt động tốt đối với tôi:

TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

Tất nhiên, trước mỗi chạy, bạn phải DELETE C:\Folder\ConcatenatedFile.csv

Vấn đề duy nhất là nếu tất cả các file có tiêu đề, sau đó nó sẽ được lặp lại trong tất cả các tập tin.

+1

Khi tôi nhập tên tệp cho tệp được nối, có nghĩa là nó được liệt kê ở cuối của các tập tin trong loaction (thứ tự chữ cái), sau đó cửa sổ dường như nối hai lần! Tôi đã kết thúc bằng cách sử dụng một tên tập tin của 1filename.csv để không có vấn đề. Tôi đoán rằng việc kết nối vào một thư mục khác cũng sẽ hoạt động ... – SebK

+0

Nếu bạn sử dụng> thay vì >>, bạn không phải xóa tệp trước. > chuyển hướng đầu ra và tạo tệp mới mỗi lần. >> chuyển hướng đầu ra và nối thêm. –

+0

Làm thế nào để điều này bỏ qua dòng đầu tiên trong tệp 2, mà OP hỏi về? –

20

Tôi không có đủ điểm danh tiếng bình luận về những khuyến nghị sử dụng *.csv >> ConcatenatedFile.csv, nhưng tôi có thể thêm một cảnh báo:

Nếu bạn tạo ConcatenatedFile.csv tập tin trong cùng thư mục mà bạn đang sử dụng cho nối nó sẽ được được thêm vào chính nó.

+1

Làm thế nào để điều này bỏ qua dòng đầu tiên trong tệp 2, mà OP hỏi về? –

2

Tôi sẽ đặt điều này trong một nhận xét cho ghostdog74, ngoại trừ đại diện của tôi quá thấp, do đó, ở đây đi.

more +2 file2.txt > temp
Mã này thực sự sẽ bỏ qua hàng 1 và 2 của tệp. OP muốn giữ tất cả các hàng từ tệp đầu tiên (để duy trì hàng tiêu đề) và sau đó loại trừ hàng đầu tiên (có lẽ là hàng tiêu đề giống nhau) trên tệp thứ hai, vì vậy chỉ loại trừ hàng tiêu đề OP nên sử dụng more +1.

type temp file1.txt > out.txt

Không rõ thứ tự kết quả từ mã này là gì. Là temp được thêm vào file1.txt (như mong muốn) hoặc được file1.txt được thêm vào temp (không mong muốn như hàng tiêu đề sẽ được chôn ở giữa tệp kết quả).

Bên cạnh đó, các hoạt động này phải mất một thời gian rất dài với các tập tin lớn (ví dụ 300MB)

-2
more +2 file1.txt > type > out.txt && type file2.txt > out.txt 
0

Dưới đây là làm thế nào để làm điều này:

(type file1.txt && more +1 file2.txt) > out.txt 
Các vấn đề liên quan