GNU/Linux >> Linux Esercitazione >  >> Linux

Come dividere un file e mantenere la prima riga in ciascuno dei pezzi?

Questo one-liner dividerà il grande csv in pezzi di 999 record, preservando la riga di intestazione nella parte superiore di ciascuno (quindi 999 record + 1 intestazione =1000 righe)

cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'

Basato sulla risposta di Ole Tange.

Vedere i commenti per alcuni suggerimenti sull'installazione parallela


Questo è di robhruska script è stato ripulito un po':

tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat "$file" >> tmp_file
    mv -f tmp_file "$file"
done

Ho rimosso wc , cut , ls e echo nei luoghi in cui non sono necessari. Ho cambiato alcuni nomi di file per renderli un po' più significativi. L'ho suddiviso su più righe solo per facilitarne la lettura.

Se vuoi essere fantasioso, puoi usare mktemp o tempfile per creare un nome file temporaneo invece di usarne uno hardcoded.

Modifica

Utilizzo di GNU split è possibile farlo:

split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

Scomposto per leggibilità:

split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

Quando --filter è specificato, split esegue il comando (una funzione in questo caso, che deve essere esportata) per ogni file di output e imposta la variabile FILE , nell'ambiente del comando, al nome del file.

Uno script o una funzione di filtro potrebbe eseguire qualsiasi manipolazione desiderata sul contenuto dell'output o persino sul nome del file. Un esempio di quest'ultimo potrebbe essere l'output con un nome file fisso in una directory variabile:> "$FILE/data.dat" Per esempio.


Puoi usare la nuova funzionalità --filter in GNU coreutils split>=8.13 (2011):

tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'

Linux
  1. Come modificare autorizzazioni e proprietari tramite riga di comando

  2. Come estrarre il file tar.gz in Linux utilizzando la riga di comando

  3. Come dividere e combinare file dalla riga di comando in Linux

  4. Come trovare il tipo di un file Img e montarlo?

  5. Come posso fare in modo che grep stampi le righe sotto e sopra ogni riga corrispondente?

Come ottenere la data e l'ora correnti in Python

Come usare Sudo e il file Sudoers

Come salvare un file in Vim/Vi e uscire dall'editor

Come elencare la dimensione di ogni file e directory e ordinare per dimensione decrescente in Bash?

Come posso anteporre una stringa all'inizio di ogni riga in un file?

Come si esegue il gunzip di un file e si conserva il file .gz?