Come dividere un file e comprimerlo direttamente?


13

Ho un file da 100 GB e voglio dividerlo in 100 file da 1 GB ciascuno (per interruzione di riga)

per esempio

split --bytes=1024M /path/to/input /path/to/output

Per i 100 file generati, voglio applicare gzip / zip a ciascuno di questi file.

È possibile utilizzare un singolo comando?


2
Utilizzare fino a 1 GB per file (meno se la riga successiva lo inserisse) --line-bytes=1024M.
Brian,

Risposte:


31

Usa "--filter":

split --bytes=1024M --filter='gzip > $FILE.gz' /path/to/input /path/to/output


questo non funziona per me, continua a sovrascrivere lo stesso file in quanto $ FILE non è definito e non scrive nemmeno nella cartella des.
splaisan,

mio errore, ho bisogno di virgolette singole per sostituire $ FILE, il mio grosso errore, mi scuso e grazie per l'aiuto: questo comando finale ha funzionato per me per salvare i dati fastq che arrivano in blocchi di 4 righe: 'zcat ERR3152365.fastq.gz | split -a 3 -d -l 1200000 --numeric-suffixes --filter = 'pigz -p 8> $ FILE.fq.gz' - splitout / part_ '
splaisan

0

Un one-liner che utilizza un condizionale è il più vicino possibile.

cd /path/to/output && split --bytes=1024M /path/to/input/filename && gzip x*

gzipverrà eseguito solo se ha splitesito positivo a causa del condizionale &&che è anche tra il cde splitassicurandosi che anche cdabbia esito positivo. Notare che splite l' gzipoutput nella directory corrente invece di avere la possibilità di specificare la directory di output. Puoi creare la directory, se necessario:

mkdir -p /path/to/output && cd /path/to/output && split --bytes=1024M /path/to/input/filename && gzip x*

Per rimettere tutto insieme:

gunzip /path/to/files/x* && cat /path/to/files/x* > /path/to/dest/filename

0

L'uso di questo comando con -dopzione consente di generare suffissi numerici.

split -d -b 2048m "myDump.dmp" "myDump.dmp.part-" && gzip myDump.dmp.part*

File generati:

    myDump.dmp.part-00
    myDump.dmp.part-01
    myDump.dmp.part-02
    ...

0

Una funzione bash per comprimere al volo con pigz

function splitreads(){

# add this function to your .bashrc or alike
# split large compressed read files into chunks of fixed size
# suffix is a three digit counter starting with 000
# take compressed input and compress output with pigz
# keeps the read-in-pair suffix in outputs
# requires pigz installed or modification to use gzip

usage="# splitreads <reads.fastq.gz> <reads per chunk; default 10000000>\n";
    if [ $# -lt 1 ]; then
        echo;
        echo ${usage};
        return;
    fi;

# threads for pigz (adapt to your needs)
thr=8

input=$1

# extract prefix and read number in pair
# this code is adapted to paired reads
base=$(basename ${input%.f*.gz})
pref=$(basename ${input%_?.f*.gz})
readn="${base#"${base%%_*}"}"

# 10M reads (4 lines each)
binsize=$((${2:-10000000}*4))

# split in bins of ${binsize}
echo "# splitting ${input} in chuncks of $((${binsize}/4)) reads"

cmd="zcat ${input} \
  | split \
    -a 3 \
    -d \
    -l ${binsize} \
    --numeric-suffixes \
    --additional-suffix ${readn} \
    --filter='pigz -p ${thr} > \$FILE.fq.gz' \
    - ${pref}_"

echo "# ${cmd}"
eval ${cmd}
}
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.