
No sé escribir variables consed
Entonces, quiero hacer la siguiente tarea usando el bucle for:
sed -n '1,200p' archivo_grande.txt > 1to200.txt sed -n '201,400p' archivo_grande.txt > 201to400.txt sed -n '401,600p' archivo_grande.txt > 401to600.txt sed -n '601,800p' archivo_grande.txt > 601to800.txt sed -n '801,1000p' archivo_grande.txt > 801to1000.txt sed -n '1001,1200p' archivo_grande.txt > 1001to1200.txt sed -n '1201,1400p' archivo_grande.txt > 1201to1400.txt sed -n '1401,1600p' archivo_grande.txt > 1401to1600.txt sed -n '1601,1800p' big_file.txt > 1601to1800.txt sed -n '1801,2000p' archivo_grande.txt > 1801to2000.txt sed -n '2001,2200p' archivo_grande.txt > 2001to2200.txt sed -n '2201,2400p' archivo_grande.txt > 2201to2400.txt sed -n '2401,2600p' archivo_grande.txt > 2401to2600.txt sed -n '2601,2800p' archivo_grande.txt > 2601to2800.txt sed -n '2801,3000p' archivo_grande.txt > 2801to3000.txt sed -n '3001,3200p' archivo_grande.txt > 3001to3200.txt sed -n '3201,3400p' archivo_grande.txt > 3201to3400.txt sed -n '3401,3600p' archivo_grande.txt > 3401to3600.txt sed -n '3601,3800p' big_file.txt > 3601to3800.txt sed -n '3801,4000p' archivo_grande.txt > 3801to4000.txt
Lo que he probado:
j=0
for ((i=1;i<=3801;i=$i+200))
do
#echo $m,$n
j=$j + 200
sed -n '$i,$j p' big_file.txt > $ito$j.txt
done
Por favor ayúdame a hacer esto. Por favor proporcione una explicación también.
Respuesta1
Haría esto con un único programa awk, en lugar de llamar a sednorteveces
awk '
BEGIN {incr = 200; i=1-incr; j=0}
NR % incr == 1 {
i += incr
j += incr
close(out)
out = i "to" j ".txt"
}
{print > out}
' big_file.txt
Esto debería ser más rápido, ya que sólo tienes que procesar el archivo grande una vez, en lugar de 4000÷200=20 veces.
Respuesta2
Cerca.
En j=$j + 200
, es necesario invocar explícitamente la expansión aritmética, es decir j=$(( j + 200 ))
.
Y en sed -n '$i,$j p' big_file.txt > $ito$j.txt
, 1) debe usar comillas dobles en lugar de comillas simples en el argumento de sed
, ya que de lo contrario $
se toma literalmente y las variables no se expandirán; 2) necesita llaves alrededor i
, ya que $ito
sería una expansión de variable válida.
Además, en contextos aritméticos no es necesario (y probablemente no debería) utilizar el $
delante del nombre de la variable.
Entonces, lo reescribiría como:
j=0
for (( i = 1 ; i <= 3801 ; i = i + 200)); do
j=$((j + 200))
sed -n "$i,$j p" big_file.txt > "${i}to$j.txt"
done
Como han comentado otros, probablemente haya una mejor manera de hacerlo, ya que ahora recorre el archivo completo una vez para cada pieza que divide.