Tento jednořádkový řádek rozdělí velký csv na kousky 999 záznamů, přičemž zachová řádek záhlaví v horní části každého z nich (takže 999 záznamů + 1 záhlaví =1000 řádků)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
Na základě odpovědi Ole Tange.
Podívejte se na komentáře pro několik tipů pro paralelní instalaci
Tohle je robhruska skript se trochu vyčistil:
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
Odebral jsem wc
, cut
, ls
a echo
v místech, kde jsou zbytečné. Změnil jsem některé názvy souborů, aby byly trochu smysluplnější. Rozdělil jsem to na více řádků, jen abych to usnadnil čtení.
Pokud si chcete udělat fantazii, můžete použít mktemp
nebo tempfile
vytvořit dočasný název souboru namísto použití pevně zakódovaného.
Upravit
Pomocí GNU split
je to možné:
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_
Přerušeno kvůli čitelnosti:
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_
Když --filter
je zadáno, split
spustí příkaz (v tomto případě funkci, která se musí exportovat) pro každý výstupní soubor a nastaví proměnnou FILE
, v prostředí příkazu, na název souboru.
Skript nebo funkce filtru mohly provádět jakoukoli manipulaci s výstupním obsahem nebo dokonce s názvem souboru. Příkladem posledně jmenovaného může být výstup s pevným názvem souboru v proměnném adresáři:> "$FILE/data.dat"
například.
Můžete použít novou funkci --filter v GNU coreutils split>=8.13 (2011):
tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'