Làm cách nào để tách stdout để đi đến một số tệp đầu ra?


12

Nói, tôi có một lệnh commandin số lượng lớn các dòng tới thiết bị xuất chuẩn:

line1
line2
.....
lineN

Tôi muốn lưu kết quả đầu ra vào đĩa, nhưng không phải dưới dạng một tệp mà là một chuỗi các tệp có 1000 dòng xuất chuẩn:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

Tôi đã cố gắng google câu trả lời, nhưng mỗi lần google chỉ cho tôi teechỉ huy, điều này là vô ích trong tình huống này. Có lẽ, tôi đang nhập sai truy vấn.

Câu trả lời:


24

Khi bạn đã hoàn tất việc lưu tệp, bạn luôn có thể splittệp thành các phần tệp hoặc nhiều tệp dựa trên số lượng dòng.

split -l 1000 output_file

hoặc thậm chí tốt hơn chỉ cần thử

command | split -l 1000 -

Điều này sẽ phân chia luồng đầu ra thành các tệp với mỗi 1000 dòng (mặc định là 1000 dòng không có tùy chọn -l).

Lệnh dưới đây sẽ cung cấp cho bạn sự linh hoạt bổ sung để đặt hoặc thực thi tiền tố cho tên tệp sẽ được tạo khi đầu ra được tạo và tách để lưu trữ vào tệp.

command | split -l 1000 - small-


Tôi đã nhầm lẫn, vì vậy, đối với những người khác, split [arguments...] [input e.g. "-" for stdin] [output_prefix]ví dụ: tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-sẽ xuất ra một loạt các tệp 100 MB có tên somedir.tar.part-000, 001, 002 và cứ thế.
ThorSummoner

3

Bạn có thể sử dụng tập lệnh bash lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

và sử dụng nó như:

cat long_file.txt | bash lines.bash

Vấn đề duy nhất tôi nhận thấy là với *đăng nhập long_file.txt(ai đó có thể sửa nó).


2
Đặt IFSchuỗi trống để tránh chia tách từ read. Sử dụng -rđể vô hiệu hóa dấu gạch chéo ngược thoát trên read. Xóa -eđể tránh dấu gạch chéo thoát trên echo. Sử dụng trích dẫn để tránh chia tách từ echo. Sử dụng -vtrong bashkể từ 4.0 để tránh bắt đầu một tiểu trình. Sử dụng tăng sau vì mã hiện tại của bạn sẽ đặt trong tệp đầu tiên chỉ 999 dòng. a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
manatwork

@manatwork Cảm ơn bạn. Chỉ có tôi printfkhông có -vcông tắc. ( bash 4.2.10). Ít nhất nó không có trong trang củaprintf
xralf

1
man printftài liệu / usr / bin / printf, trong cuộc sống không bao giờ có thể đặt biến môi trường. Xem help printfcho printfvỏ tích hợp trong tài liệu của.
manatwork

@manatwork OK. Dường như có lỗi cú pháp trong ++/phần này.
xralf

1
Một điều nữa: không cần sử dụng sigil trong đánh giá số học, trừ khi bạn cần mở rộng tham số một cách rõ ràng. Trong mở rộng số học, các biến được đánh giá bằng mọi cách.
manatwork
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.