GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo truncar el archivo por líneas?

El sed el enfoque está bien, pero recorrer todas las líneas no lo está. Si sabe cuántas líneas quiere mantener (para tener un ejemplo, uso 99 aquí), puede hacerlo así:

sed -i '100,$ d' myfile.txt

Explicación:sed es un procesador de expresiones regulares. Con la opción -i dado, procesa un archivo directamente ("en línea"), en lugar de simplemente leerlo y escribir los resultados en la salida estándar. 100,$ simplemente significa "desde la línea 100 hasta el final del archivo" y va seguido del comando d , que probablemente adivinó correctamente que significa "eliminar". En resumen, el comando significa:"Eliminar todas las líneas desde la línea 100 hasta el final del archivo de myfile.txt". 100 es la primera línea que se eliminará, ya que desea mantener 99 líneas.

Editar: Si, por otro lado, hay archivos de registro que desea conservar, p. el último 100 líneas:

[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt

¿Qué está pasando aquí?:

  • [ $(wc -l myfile.txt) -gt 100 ] :haga lo siguiente solo si el archivo tiene más de 100 líneas
  • $((100 - $(wc -l myfile.txt|awk '{print $1}'))) :calcula el número de líneas para eliminar (es decir, todas las líneas del archivo excepto las (últimas) 100 para conservar)
  • 1, $((..)) d :elimina todas las líneas desde la primera hasta la línea calculada

EDITAR: Como la pregunta se acaba de editar para dar más detalles, también incluiré esta información adicional con mi respuesta. Los hechos agregados son:

  • un tamaño específico permanecerá con el archivo (10.000 bytes)
  • cada línea tiene un tamaño específico en bytes (300 bytes en el ejemplo)

A partir de estos datos es posible calcular el número de líneas a quedar como "/", que con el ejemplo supondría 33 líneas. El término de shell para el cálculo:$((size_to_remain / linesize)) (al menos en Linux usando Bash, el resultado es un número entero). El comando ajustado ahora sería:

# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt

Como los tamaños se conocen de antemano, ya no es necesario un cálculo incrustado en el sed dominio. Pero por flexibilidad, dentro de algún script de shell se pueden usar variables.

Para el procesamiento condicional basado en el tamaño del archivo, se puede usar la siguiente construcción de "prueba":

[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&

lo que significa:"si el tamaño de $file excede 100kB, haz..." (ls -lk enumera el tamaño del archivo en kB en la posición 5, por lo tanto, awk se usa para extraer exactamente esto).


Linux
  1. ¿Cómo eliminar líneas duplicadas dentro de un archivo de texto?

  2. ¿Contar líneas en un archivo?

  3. Cómo contar líneas en un archivo en UNIX/Linux

  4. Cómo truncar el archivo /var/log/lastlog

  5. Cómo obtener solo el número de líneas de un archivo

Cómo truncar archivos (vacíos) en Linux

Cómo usar el comando Truncar en Linux

Cómo imprimir líneas duplicadas en un archivo de texto en Linux

Cómo mezclar líneas en un archivo en Linux

Cómo invertir líneas en un archivo por caracteres en Linux

Cómo encontrar las líneas más largas en un archivo en Linux