Quiero dividir un archivo de texto según un conjunto predefinido de filas.
Por ejemplo. tengo un archivo
a
b
c
d
e
f
Y luego tengo los siguientes conjuntos de filas (estos podrían almacenarse como sea más conveniente, en un archivo, en varios archivos,...).
1,2
3,6
5,4
Quiero dividir mi archivo para recuperar 3 archivos como:
archivo1
a
b
archivo2
c
f
archivo3
e
d
Respuesta aceptada:
Aquí hay un bash
script asumiendo que su archivo de entrada se llama infile y los rangos se almacenan 1 por línea en un archivo llamado 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
Esto simplemente usa sed
para imprimir las líneas especificadas por los rangos y guarda cada resultado como un archivo nuevo (los archivos creados se denominan archivo1 archivo2 archivo3 etc.). Dos invocaciones de sed
se utilizan para conservar el orden especificado de las filas.
Tenga en cuenta que este simple script no realiza ninguna verificación de formato o error, y los archivos existentes se nombran, p. el archivo 1 se sobrescribirá.
Una alternativa simplificada (cortesía de @muru) usando while read
y dejar que bash divida los rangos en lugar de cortar:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Si el orden de las líneas en los archivos de salida es importante (por ejemplo, filas 5,4 !=4,5), entonces sed
bit deberá dividirse en dos invocaciones separadas similares a la primera secuencia de comandos.