Chci rozdělit textový soubor podle předem definované sady řádků.
Například. Mám soubor
a
b
c
d
e
f
A pak mám následující sady řádků (ty by mohly být uloženy, ale je to pohodlnější, v jednom souboru, více souborech,…).
1,2
3,6
5,4
Chci rozdělit svůj soubor tak, aby se mi vrátily 3 soubory jako:
soubor1
a
b
soubor2
c
f
soubor3
e
d
Přijatá odpověď:
Zde je bash
skript za předpokladu, že se váš vstupní soubor jmenuje infile a rozsahy jsou uloženy 1 na řádek v souboru s názvem splits:
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
Toto jednoduše používá sed
vytiskne řádky určené rozsahy a uloží každý výsledek jako nový soubor (vytvořené soubory se jmenují soubor1 soubor2 soubor3 atd.). Dvě vyvolání sed
se používají k zachování určeného pořadí řádků.
Všimněte si, že tento jednoduchý skript neprovádí žádnou kontrolu formátu nebo chyb a existující soubory pojmenované např. soubor1 bude přepsán.
Zjednodušená alternativa (s laskavým svolením @muru) pomocí while read
a nechat bash rozdělit rozsahy místo řezu:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Pokud je důležité pořadí řádků ve výstupních souborech (např. řádky 5,4 !=4,5), pak sed
bit bude nutné rozdělit na dvě samostatná vyvolání podobná prvnímu skriptu.