Pregunta

Tengo un archivo muy largo que quiero imprimir pero omitiendo las primeras 1e6 líneas, por ejemplo. Busco en la página del manual del gato pero no vi ninguna opción para hacerlo. Estoy buscando un comando para hacer esto o un programa bash simple.

¿Fue útil?

Solución

Necesitarás cola. Algunos ejemplos:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Si realmente necesita SALTAR un número particular de " primero " líneas, use

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

Es decir, si desea omitir N líneas, comience a imprimir la línea N + 1. Ejemplo:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Si desea ver las últimas líneas, omita el " + " ;:

$ tail -n <N> <filename>
< last N lines of file. >

Otros consejos

Si tiene GNU tail disponible en su sistema, puede hacer lo siguiente:

tail -n +1000001 huge-file.log

Es el carácter + que hace lo que quieres. Para citar de la página del manual:

  

Si el primer carácter de K (el número de bytes o líneas) es un   `+ ', imprima comenzando con el elemento Kth desde el inicio de cada archivo.

Por lo tanto, como se señaló en el comentario, al poner +1000001 comienza a imprimir con el primer elemento después de las primeras 1,000,000 de líneas.

La forma más fácil que encontré para eliminar las primeras diez líneas de un archivo:

$ sed 1,10d file.txt

Una versión menos detallada con AWK:

awk 'NR > 1e6' myfile.txt

Pero recomendaría usar números enteros.

Solo para proponer una sed alternativa. :) Para omitir el primer millón de líneas, intente |sed '1,1000000d'.

Ejemplo:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005

si desea omitir las primeras dos líneas
tail -n +3 <filename>

si desea omitir la primera línea x
tail -n +$((x+1)) <filename>

Si desea ver las primeras 10 líneas, puede usar sed de la siguiente manera:

sed -n '1,10 p' myFile.txt

o si desea ver líneas del 20 al 30, puede usar:

sed -n '20,30 p' myFile.txt

Utilice el sed delete comando con una dirección de rango . Por ejemplo:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Alternativamente, si solo desea imprimir un rango conocido, use el comando de impresión con la bandera -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Esta solución debería funcionar de manera confiable en todos los sistemas UNIX, independientemente de la presencia de utilidades GNU.

Este script de shell funciona bien para mí:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Utilizado con este archivo de muestra (file.txt):

one
two
three
four
five
six

El comando (extraerá de la segunda a la cuarta línea del archivo):

edu@debian5:~$./script.sh 2 4 file.txt

Salida de este comando:

two
three
four

Por supuesto, puede mejorarlo, por ejemplo, probando que todos los valores de argumento son los esperados :-)

Puede hacer esto usando los comandos head y tail:

head -n <num> | tail -n <lines to print>

donde num es 1e6 + el número de líneas que desea imprimir.

sed -n '1d;p'

este comando eliminará la primera línea e imprimirá el resto

cat < File > | awk '{if(NR > 6) print $0}'

Necesitaba hacer lo mismo y encontré este hilo.

Intenté " tail -n +, pero simplemente imprimió todo.

Las líneas más + funcionaron bien en el indicador, pero resultó que se comportó de manera totalmente diferente cuando se ejecutó en modo sin cabeza (cronjob).

Finalmente escribí esto yo mismo:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top