Bagaimana cara membagi stdout untuk menuju ke beberapa file output?


12

Katakanlah, saya memiliki perintah commandyang mencetak sejumlah besar baris ke stdout:

line1
line2
.....
lineN

Saya ingin menyimpan output ke disk, tetapi bukan sebagai file tunggal, tetapi sebagai urutan file masing-masing memiliki 1000 baris stdout:

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

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

etc

Saya sudah mencoba google jawabannya, tetapi setiap kali google menunjuk saya ke teeperintah, yang tidak berguna dalam situasi ini. Mungkin, saya memasukkan kueri yang salah.

Jawaban:


24

Setelah Anda selesai menyimpan file, Anda selalu bisa splitfile menjadi potongan-potongan file atau beberapa file berdasarkan jumlah baris.

split -l 1000 output_file

atau bahkan lebih baik coba saja

command | split -l 1000 -

Ini akan membagi aliran output menjadi file dengan setiap 1000 baris (standarnya adalah 1000 baris tanpa opsi -l).

Perintah di bawah ini akan memberi Anda fleksibilitas tambahan untuk menempatkan atau menerapkan awalan ke nama file yang akan dihasilkan ketika output dihasilkan dan dipisahkan untuk menyimpan ke dalam file.

command | split -l 1000 - small-


Saya bingung, jadi untuk yang lain, split [arguments...] [input e.g. "-" for stdin] [output_prefix]misalnya, tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-akan menghasilkan banyak file 100MB bernama somedir.tar.part-000, 001, 002 dan seterusnya.
ThorSummoner

3

Anda dapat menggunakan skrip bash lines.bash

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

dan gunakan sebagai:

cat long_file.txt | bash lines.bash

Satu-satunya masalah yang saya perhatikan adalah dengan *masuk long_file.txt(seseorang dapat memperbaikinya).


2
Setel IFSke string kosong untuk menghindari pemisahan kata read. Gunakan -runtuk menonaktifkan backslash melarikan diri read. Hapus -euntuk menghindari backslash melarikan diri echo. Gunakan kutipan untuk menghindari pemisahan kata echo. Gunakan -vdi bashsejak 4.0 untuk menghindari memulai sub-proses. Gunakan post-incrementing karena kode Anda saat ini akan dimasukkan ke file pertama hanya 999 baris. a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
manatwork

@manatwork Terima kasih. Hanya saya printftidak memiliki -vsaklar. ( bash 4.2.10). Setidaknya itu bukan di halaman manualprintf
xralf

1
man printfdokumen / usr / bin / printf, yang tidak pernah dapat mengatur variabel lingkungan dalam hidup. Lihat help printfuntuk printfshell built-in dokumentasi ini.
manatwork

@manatwork OKE. Tampaknya ada kesalahan sintaksis di ++/bagian ini.
xralf

1
Satu hal lagi: tidak perlu menggunakan sigil di dalam evaluasi aritmatika, kecuali Anda membutuhkan ekspansi parameter secara eksplisit. Dalam ekspansi aritmatika variabel tetap dievaluasi.
manatwork
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.