Voglio dividere un file di testo in base a un insieme predefinito di righe.
Ad esempio. Ho un file
a
b
c
d
e
f
E poi ho le seguenti serie di righe (queste potrebbero essere memorizzate tuttavia è più conveniente, su un file, più file,...).
1,2
3,6
5,4
Voglio dividere il mio file in modo da ottenere 3 file come:
file1
a
b
file2
c
f
file3
e
d
Risposta accettata:
Ecco una bash
script presupponendo che il tuo file di input sia chiamato infile e che gli intervalli siano archiviati 1 per riga in un file chiamato 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
Questo usa semplicemente sed
per stampare le righe specificate dagli intervalli e salva ogni risultato come un nuovo file (i file creati sono denominati file1 file2 file3 ecc.). Due invocazioni di sed
vengono utilizzati per preservare l'ordine specificato delle righe.
Nota che non esiste un controllo del formato o degli errori eseguito da questo semplice script e i file esistenti denominati ad es. file1 verrà sovrascritto.
Un'alternativa semplificata (per gentile concessione di @muru) usando while read
e lasciare che bash suddivida gli intervalli invece di tagliare:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Se l'ordine delle righe nei file di output è importante (es. righe 5,4 !=4,5), allora sed
bit dovrà essere suddiviso in due invocazioni separate simili al primo script.