2013-02-20 3 views
17

Sto usando il seguente comando per dividere un file. Dovrebbe dividere ogni 50.000 righe e usare un suffisso numerico a 4 cifre. Il file è di circa 140 milioni di righe.Come dividere un file usando un suffisso numerico

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

Ma quando corro che sto ottenendo questo errore:

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

Qual è il comando corretto per questo?

risposta

4

Vorrei utilizzare awk. Ti dà un controllo più preciso sui tuoi file di output e nomi di file. Dovrebbe essere solo chiedere troppo veloce. Ecco come dividere un file di 100 linea in 20 blocchi di linea:

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

Questo dovrebbe creare alcuni file come:

file_0020 
file_0040 
file_0060 
file_0080 
file_0100 

regolare di conseguenza. HTH.

32

Dal momento che l'aiuto primario dal GNU split dice:

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 

Sembra a me che tu abbia bisogno di riorganizzare le opzioni un po ':

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

(Da pagina di manuale, GNU coreutils 8.21) Ciò di cui hai bisogno sembra essere -a/- suffix-length = N (genera suffissi di lunghezza N (default 2)), non -n/- number = CHUNKS (genera file di output CHUNKS)

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

e si dovrebbe ottenere: domains_0000, domains_0001 ...

0

Non so se questo ti aiuta, ma se si aggiunge un 1 per il nome del file prefisso cioè outfile1 si finirà con:

outfile101 
outfile102 
outfile103 

Capisco che questo potrebbe non essere quello che stai cercando, ma vari programmi non analizzano gli zeri iniziali negli array di lavoro e così, non importa se gli informatici "contano sempre da zero". Almeno in questo modo è possibile analizzare i file con una gamma più ampia di programmi.