Tách một tệp theo dòng và có quyền kiểm soát phần mở rộng tệp kết quả


28

Có một lệnh tiêu chuẩn để chia tách tập tin.

Ví dụ: nếu tôi muốn chia một tệp từ thành nhiều đoạn 10000 dòng, tôi có thể sử dụng:

split -dl 10000 words wrd

và nó sẽ tạo ra một số tệp có dạng wrd.01, wrd.02, v.v.

Nhưng tôi muốn có một phần mở rộng cụ thể cho các tệp đó - ví dụ: tôi muốn nhận các tệp wtd.01.txt, wrd.02.txt.

Có cách nào để làm điều đó?

Câu trả lời:


11

Không phải với split, nhưng bạn có thể dễ dàng đổi tên chúng sau đó hoặc bạn có thể thực hiện trong awk:

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile

Có vẻ tốt - nhưng không hoạt động. Trong biểu mẫu của bạn, phàn nàn về "biểu thức cho` >> 'chuyển hướng có giá trị chuỗi null "và nếu" tệp "bị" thay đổi "thành" tên tệp ", xuất ra các tệp có dạng wrd. {Số tệp}. {Số dòng} .txt (khá nhiều trong số họ :)
Rogach

@Rogach Xin lỗi, tôi đã không kiểm tra nó, vì vậy tôi quên rằng awk không thực hiện phép chia số nguyên. Tôi đã thử cái này.
Kevin

49

Điều này không có sẵn trước đó nhưng với các phiên bản gần đây hơn ( ≥ 8.16) của gnu splitmột người có thể sử dụng công --additional-suffixtắc để có quyền kiểm soát phần mở rộng kết quả. Từ man split:

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

vì vậy khi sử dụng tùy chọn đó:

split -dl 10000 --additional-suffix=.txt words wrd

các mảnh kết quả sẽ tự động kết thúc bằng .txt:

wrd00.txt
wrd01.txt
.........

3
Không hoạt động trên mac
ericgu

2
Tôi yêu sự mỉa mai của bạn. Tôi là một unix n00b từ thế giới Apple. Tôi đang sử dụng OS X Yosemite và tôi không muốn người khác gặp sự cố và bị cháy như tôi đã làm. Tôi đã thử nghiệm và xem xét tại các tài liệu và chúng tôi không có thông số này. Tôi có thể đã bỏ lỡ một cái gì đó. developer.apple.com/l
Library / mac / documentation / Darwin / Reference / /

5
@swiftshokunin - câu trả lời của tôi liên quan đến gnu split, một phần của gnu coreutils. Nó cũng có sẵn trên OSX nếu bạn cài đặt coreutilsqua homebrewnhưng lưu ý rằng theo mặc định, trên OSX, các gnutiện ích có gtên được đặt trước (ví dụ gstatthay vì stat) vì vậy bạn gọi nó dưới dạng gsplit(hoặc thay đổi PATH theo hướng dẫn ở đây nếu bạn muốn để sử dụng nó như splittrên OSX split). HTH.
don_crissti 10/2/2015

1
Câu trả lời tốt đẹp. trên OS X, sử dụng gsplitđể làm cho các hậu tố số (-d) hoạt động.
Brent Faust

1
wow, tôi không biết rằng có gsplit - có lẽ là từ coreutils đã đề cập ở trên và nó có hậu tố --additable-hậu tố. Cảm ơn mọi người đã bình luận về giải pháp này :)
ukasz Rysiak

13

Nhiệm vụ như vậy được quản lý tốt nhất với vỏ. Sử dụng split và sau đó viết một vòng lặp đơn giản để đổi tên các tập tin. Ví dụ

for file in wrd.*
do
    mv "$file" "$file.txt"
done

sẽ đổi tên các tệp wrd.01, wrd.02, v.v. để tất cả chúng đều có phần mở rộng .txt.


Điều đó khá rõ ràng, nhưng nó sẽ phá vỡ sự đồng nhất của kịch bản bash.
Rogach

1
Triết lý của Unix là cung cấp cho bạn một bộ công cụ đơn giản mà sau đó bạn kết hợp để thực hiện một công việc. "Tính đồng nhất của tập lệnh bash" không phải là một yêu cầu đã nêu trong câu hỏi của bạn.
Kyle Jones

7
PS: split+mvkết hợp nhanh hơn 6 lần so với awk(khoảng 3 giây so với 18 giây ) đối với tệp đầu vào 10 triệu dòng (75 MB) ... văn bản trong mỗi dòng là số dòng riêng của nó ... Cảm ơn bạn đã nêu lại "hiển nhiên" :)
Peter.O

3
PPS: Tôi vừa mới kiểm tra điều này thêm một chút. Chênh lệch tốc độ có liên quan đến số lượng tệp được tạo so với số lượng định dạng và tính toán số học mà awk thực hiện cho mỗi và mọi dòng bất kể số lượng tệp đầu ra ... Sử dụng cùng một tệp đầu vào như ví dụ trên: Khi có 100 lần ít tác phẩm, split + mv75 nhanh hơn lần so với awk: Khi có hơn 100 lần tác phẩm, split + mv1,5 nhanh hơn so với thời gian awk. Vì vậy, đối với tôi, split + mvphương pháp này thắng, xuống tay. Nó là sự đồng ý (được cho là moreso), và nhanh hơn awk.
Peter.O

1
nếu bạn lo lắng về việc nó dài 5 dòng, hãy thử điều này thay vào đó: for file in wrd.*; do mv "$file" "$file.txt"; done:)
Tony
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.