Come dividere stdout per passare a più file di output?


12

Dì, ho un comando commandche stampa un numero enorme di righe su stdout:

line1
line2
.....
lineN

Voglio salvare l'output su disco, ma non come un singolo file, ma come una sequenza di file ciascuno con 1000 righe di stdout:

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

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

etc

Ho provato a google la risposta, ma ogni volta che google mi indica di teecomandare, il che è inutile in questa situazione. Probabilmente sto inserendo domande sbagliate.

Risposte:


24

Una volta terminato il salvataggio del file, è possibile sempre splitil file in file o più file in base al numero di righe.

split -l 1000 output_file

o meglio ancora basta provare

command | split -l 1000 -

Questo dividerà il flusso di output in file con ogni 1000 righe (il valore predefinito è 1000 righe senza l'opzione -l).

Il comando seguente ti darà ulteriore flessibilità per mettere o imporre un prefisso al nome del file che verrà generato quando l'output viene generato e diviso per archiviare nel file.

command | split -l 1000 - small-


Mi sono confuso, quindi per altri, è split [arguments...] [input e.g. "-" for stdin] [output_prefix], per esempio: tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-avrebbe prodotto un mucchio di file da 100 MB chiamati somedir.tar.part-000, 001, 002 e così via.
ThorSummoner,

3

Puoi usare uno script bash lines.bash

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

e usalo come:

cat long_file.txt | bash lines.bash

L'unico problema che ho notato è con l' *accesso long_file.txt(qualcuno potrebbe correggerlo).


2
Impostare la IFSstringa vuota per evitare la divisione delle parole read. Utilizzare -rper disabilitare l'esclusione della barra rovesciata read. Rimuovere -eper evitare la fuoriuscita della barra rovesciata echo. Usa le virgolette per evitare di dividere le parole echo. Utilizzare -va bashdal 4,0 per evitare di avviare un sottoprocesso. Usa il post-incremento poiché il tuo codice corrente inserirà nel primo file solo 999 righe. a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
arte

@manatwork Grazie. Solo il mio printfnon ha -vswitch. ( bash 4.2.10). Almeno non è nella manpage diprintf
xralf il

1
man printfdocumenti / usr / bin / printf, che nella vita non avrebbero mai potuto impostare una variabile d'ambiente. Consultare la documentazione integrata help printfdella printfshell.
Manatwork,

@manatwork OK. Sembra che ci sia ancora un errore di sintassi nella ++/parte.
Xralf,

1
Ancora una cosa: non è necessario utilizzare sigil nella valutazione aritmetica, a meno che non sia necessario l'espansione dei parametri in modo esplicito. Nell'espansione aritmetica le variabili vengono comunque valutate.
Manatwork,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.