Comment diviser un fichier et compresser directement?

13

J'ai un fichier de 100 Go et je souhaite le diviser en 100 fichiers de 1 Go chacun (par saut de ligne)

par exemple

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

Pour les 100 fichiers générés, je souhaite appliquer gzip / zip à chacun de ces fichiers.

Est-il possible d'utiliser une seule commande?

Ryan
la source
2
Pour jusqu'à 1 Go par fichier (moins si la ligne suivante le met), utilisez --line-bytes=1024M.
Brian

Réponses:

31

Utilisez "--filter":

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

Peter
la source
cela ne fonctionne pas pour moi, continue d'écraser le même fichier car $ FILE n'est pas défini et n'écrit même pas dans le dossier des.
splaisan
mon erreur, a besoin de guillemets simples pour remplacer $ FILE, ma grosse erreur, mes excuses et merci pour l'aide: cette commande finale a fonctionné pour moi pour enregistrer les données fastq qui viennent en blocs de 4 lignes: 'zcat ERR3152365.fastq.gz | split -a 3 -d -l 1200000 - suffixes-numériques --filter = 'pigz -p 8> $ FILE.fq.gz' - splitout / part_ '
splaisan
0

Un one-liner utilisant un conditionnel est aussi proche que possible.

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

gzipne fonctionnera que si splitest couronnée de succès en raison de la condition &&qui est aussi entre cdet spliten veillant à l' cdest couronnée de succès, trop .. Notez que splitet la gzipsortie dans le répertoire courant au lieu d'avoir la possibilité de spécifier le répertoire de sortie. Vous pouvez créer le répertoire, si nécessaire:

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

Pour tout remettre ensemble:

gunzip /path/to/files/x* && cat /path/to/files/x* > /path/to/dest/filename
En pause jusqu'à nouvel ordre.
la source
0

L'utilisation de cette commande avec -doption vous permet de générer des suffixes numériques.

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

Fichiers générés:

    myDump.dmp.part-00
    myDump.dmp.part-01
    myDump.dmp.part-02
    ...
Iván
la source
0

Une fonction bash pour compresser à la volée avec 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}
}
splaisan
la source