GNU/Linux >> Znalost Linux >  >> Ubuntu

Rozdělit soubor na základě předem definované sady řádků?

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.


Ubuntu
  1. Jak nainstalovat Ubuntu ze souboru Iso?

  2. Používání sed k aktualizaci souboru Grub?

  3. Nastavte virtuální hostitele na CentOS

  1. Jak rozdělit soubory CSV podle počtu zadaných řádků?

  2. unix - rozdělte velký soubor .gz po řádcích

  3. Jak nastavit soubor jako NENÍ spustitelný?

  1. Jak nahradit řetězec v souboru (souborech)?

  2. Ubuntu – Rozdělit zvuk na několik kusů na základě časových razítek z textového souboru pomocí Sox nebo Ffmpeg?

  3. Nahradit text více souborů textem Sed?