web-dev-qa-db-fra.com

Comment diviser un fichier à l'aide d'un suffixe numérique

J'utilise la commande suivante pour diviser un fichier. Il doit se diviser toutes les 50 000 lignes et utiliser un suffixe numérique à 4 chiffres. Le fichier compte environ 140 millions de lignes.

split -d -l -n 4 50000 domains.xml domains_

Mais quand je cours, j'obtiens cette erreur:

split: -n: invalid number of lines
Try `split --help' for more information.

Quelle est la bonne commande pour cela?

25
user2087872

J'utiliserais awk. Il vous donne un contrôle plus fin sur vos fichiers de sortie et vos noms de fichiers. Il faut juste demander vite aussi. Voici comment diviser un fichier de 100 lignes en blocs de 20 lignes:

awk 'NR%20==1 { file = FILENAME "_" sprintf("%04d", NR+19) } { print > file }' domains.xml

Cela devrait créer des fichiers comme:

file_0020
file_0040
file_0060
file_0080
file_0100

Ajuste en accord. HTH.

7
Steve

Depuis l'aide principale de GNU split dit:

Usage: /usr/gnu/bin/split [OPTION]... [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is 'x'.  With no INPUT, or when INPUT
is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -a, --suffix-length=N   generate suffixes of length N (default 2)
      --additional-suffix=SUFFIX  append an additional SUFFIX to file names.
  -b, --bytes=SIZE        put SIZE bytes per output file
  -C, --line-bytes=SIZE   put at most SIZE bytes of lines per output file
  -d, --numeric-suffixes[=FROM]  use numeric suffixes instead of alphabetic.
                                   FROM changes the start value (default 0).
  -e, --elide-empty-files  do not generate empty output files with '-n'
      --filter=COMMAND    write to Shell COMMAND; file name is $FILE
  -l, --lines=NUMBER      put NUMBER lines per output file
  -n, --number=CHUNKS     generate CHUNKS output files.  See below
  -u, --unbuffered        immediately copy input to output with '-n r/...'
      --verbose           print a diagnostic just before each
                            output file is opened
      --help     display this help and exit
      --version  output version information and exit

Il me semble que vous devez réorganiser un peu vos options:

split -a 4 -d -l 50000 domains.xml domains_
55
Jonathan Leffler

(D'après la page de manuel, GNU coreutils 8.21) Ce dont vous avez besoin semble être -a/- suffix-length = N (générer des suffixes de longueur N (par défaut 2)), pas -n/- -number = CHUNKS (générer des fichiers de sortie CHUNKS)

split -d -l 50000 -a 4 domains.xml domains_

et vous devriez obtenir: domaines_0000, domaines_0001 ...

11
Serge Chastel