Estoy obteniendo resultados de un programa que primero produce una línea que es un montón de encabezados de columna, y luego un montón de líneas de datos. Quiero cortar varias columnas de este resultado y verlo ordenado de acuerdo con varias columnas. Sin las cabeceras, el corte y la clasificación se lleva a cabo fácilmente a través de la -k
opción de sort
, junto con cut
o awk
para ver un subconjunto de las columnas. Sin embargo, este método de clasificación mezcla los encabezados de columna con el resto de las líneas de salida. ¿Hay una manera fácil de mantener los encabezados en la parte superior?
text-processing
sort
table
jonderry
fuente
fuente
{ head -1; sort; }
funcione. Siempre elimina un montón de texto después de la primera línea. ¿Alguien sabe por qué sucede esto?head
está leyendo más de una línea en un búfer y tirando la mayor parte. Mised
idea tuvo el mismo problema.lseek
entrada capaz, por lo que no funcionará cuando se lea desde una tubería. Funcionará si redirige a un archivo>outfile
y luego se ejecuta{ head -n 1; sort; } <outfile
Respuestas:
Robar la idea de Andy y convertirla en una función para que sea más fácil de usar:
Ahora puedo hacer:
fuente
ps -C COMMAND
puede ser más apropiado quegrep COMMAND
, pero es solo un ejemplo. Además, no puede usar-C
si también usó otra opción de selección como-U
.body
? Como enbody sort
obody grep
. Pensamientos?header
abody
, porque estás haciendo la acción en el cuerpo. Ojalá eso tenga más sentido.body
a todos los participantes posteriores de la tubería:ps -o pid,comm | body grep less | body sort -k1nr
<foo body sort -k2
obody sort -k2 <foo
. Solo un personaje extra de lo que querías.Puede mantener el encabezado en la parte superior de esta manera con bash:
O hazlo con perl:
fuente
{}
bien en lugar de()
?IFS=
desactiva la división de palabras al leer la entrada. No creo que sea necesario al leer$REPLY
.echo
expandirá la barra invertida sixpg_echo
se establece (no el valor predeterminado);printf
Es más seguro en ese caso.echo $REPLY
sin comillas condensará espacios en blanco; Creo queecho "$REPLY"
debería estar bien.read -r
es necesario si la entrada puede contener escapes de barra invertida. Algo de esto podría depender de la versión bash.read REPLY; echo $REPLY
(tiras de espacios iniciales ) yread; echo $REPLY
(no).xpg_echo
depende de su sistema, por ejemplo, en Solaris, creo que su valor predeterminado es verdadero. Es por eso que a Gilles le gustaprintf
tanto: es lo único con un comportamiento predecible.Encontré una buena versión awk que funciona muy bien en los scripts:
fuente
sort
comando externamente? ¿Alguien sabe de al menos un enlace a una página que explique el uso de tuberías dentro de awk?Hackish pero efectivo: anteponer
0
todas las líneas de encabezado y1
todas las demás líneas antes de ordenar. Despoja al primer personaje después de ordenar.fuente
Aquí hay un poco de ruido de línea perl mágico a través del cual puede canalizar su salida para ordenar todo, pero mantenga la primera línea en la parte superior:
perl -e 'print scalar <>, sort <>;'
fuente
Probé la
command | {head -1; sort; }
solución y puedo confirmar que realmente arruina las cosas :head
lee en varias líneas desde la tubería, luego emite solo la primera. Entonces, el resto de la salida, quehead
no se leyó, se pasa a - ¡sort
NO el resto de la salida a partir de la línea 2!El resultado es que le faltan líneas (¡y una línea parcial!) Que estaban al comienzo de la salida de su comando (excepto que todavía tiene la primera línea), un hecho que es fácil de confirmar agregando una tubería al
wc
final de la tubería anterior, ¡pero eso es extraordinariamente difícil de rastrear si no lo sabe! Pasé al menos 20 minutos tratando de averiguar por qué tenía una línea parcial (los primeros 100 bytes más o menos cortados) en mi salida antes de resolverla.Lo que terminé haciendo, que funcionó muy bien y no requirió ejecutar el comando dos veces, fue:
Si necesita poner la salida en un archivo, puede modificar esto para:
fuente
head
incorporada de ksh93 o laline
utilidad (en sistemas que todavía tienen uno) ognu-sed -u q
oIFS=read -r line; printf '%s\n' "$line"
, que leen la entrada de un byte a la vez para evitar eso.Creo que esto es lo más fácil.
o esto que posiblemente sea más rápido ya que no crea un sub shell
Otros usos geniales
barajar líneas después de la fila del encabezado
líneas inversas después de la fila del encabezado
fuente
cat file | { head -n 1 ; sort ; } > file2
solo muestra la cabezafuente
command
dos veces. Por lo tanto, se limita a algunos comandos específicos. Sin embargo, para elps
comando solicitado en el ejemplo, funcionaría.¡Simple y directo!
fuente
command
dos veces. Por lo tanto, no es realmente adecuado para su uso en una tubería.Vine aquí buscando una solución para el comando
w
. Este comando muestra detalles de quién está conectado y qué está haciendo.Para mostrar los resultados ordenados, pero con los encabezados en la parte superior (hay 2 líneas de encabezados), me decidí por:
Obviamente, esto ejecuta el comando
w
dos veces y, por lo tanto, puede no ser adecuado para todas las situaciones. Sin embargo, para su ventaja es sustancialmente más fácil de recordar.Tenga en cuenta que los
tail -n +3
medios 'muestran todas las líneas desde el 3 en adelante' (verman tail
para más detalles).fuente
Trata de hacerlo:
fuente