GNU/Linux >> Znalost Linux >  >> Linux

Jak rozdělit soubor a zachovat první řádek v každém z kusů?

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"'

Linux
  1. Jak změnit oprávnění a vlastníky pomocí příkazového řádku

  2. Jak extrahovat soubor tar.gz v Linuxu pomocí příkazového řádku

  3. Jak procházet řádky souboru?

  1. Jak zjistit typ souboru Img a připojit jej?

  2. Jak mohu přimět grep, aby vytiskl řádky pod a nad každým odpovídajícím řádkem?

  3. Jak přesměrovat stderr a stdout na různé soubory ve stejném řádku ve skriptu?

  1. Jak rozdělit a kombinovat soubory z příkazového řádku v Linuxu

  2. Jak vložit text na začátek každého řádku ve Vimu

  3. Jak zazipujete soubor a uchováte soubor .gz?