puddletag picard musicbrainz mp3tag kid3 linux bash shell command-line command

linux - mp3tag - musicbrainz picard



Linux cabeza/cola con desplazamiento (3)

¿Hay alguna forma en Linux de solicitar el encabezado o la cola, pero con un desplazamiento adicional de los registros a ignorar?

Por ejemplo, si el archivo example.lst contiene lo siguiente:

row01 row02 row03 row04 row05

Y uso head -n3 example.lst puedo obtener las filas 1 a 3, pero ¿qué head -n3 example.lst si deseo que se salte la primera fila y se obtengan las filas 2 a 4?

Pregunto porque algunos comandos tienen un encabezado que puede no ser deseable dentro de los resultados de búsqueda. Por ejemplo, du -h ~ --max-depth 1 | sort -rh du -h ~ --max-depth 1 | sort -rh devolverá el tamaño del directorio de todas las carpetas dentro del directorio de inicio ordenadas en orden descendente, pero agregará el directorio actual a la parte superior del conjunto de resultados (es decir, ~ ).

Las páginas de manual de Head and Tail no parecen tener ningún parámetro de desplazamiento, por lo que quizás haya algún tipo de comando de range donde se puedan especificar las líneas requeridas: por ejemplo, range 2-10 o algo así


De la man tail :

-n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth

Por lo tanto, puede utilizar ... | tail -n +2 | head -n 3 ... | tail -n +2 | head -n 3 ... | tail -n +2 | head -n 3 para obtener 3 líneas a partir de la línea 2.

Los métodos sin cabeza / cola incluyen sed -n "2,4p" y awk "NR >= 2 && NR <= 4" .


Para obtener las filas entre 2 y 4 (ambos inclusive), puede usar:

head -n4 example.lst | tail -n+2

o

head -n4 example.lst | tail -n3


Tomó mucho tiempo terminar con esta solución, que parece ser la única que cubrió todos los casos de uso (hasta ahora):

command | tee full.log | stdbuf -i0 -o0 -e0 awk -v offset=${MAX_LINES:-200} / ''{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset]; printf "." > "/dev/stderr" } } END { print "" > "/dev/stderr"; for(i=NR-offset+1 > offset ? NR-offset+1: offset+1 ;i<=NR;i++) { print a[i]} }''

Lista de características:

  • Salida en vivo para cabeza (obviamente que para cola no es posible)
  • no uso de archivos externos
  • progressbar on stderr, un punto para cada línea después de MAX_LINES, muy útil para tareas de larga ejecución.
  • evita un posible orden de registro incorrecto debido al almacenamiento en búfer (stdbuf)