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 -kopción de sort, junto con cuto awkpara 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?headestá leyendo más de una línea en un búfer y tirando la mayor parte. Misedidea tuvo el mismo problema.lseekentrada capaz, por lo que no funcionará cuando se lea desde una tubería. Funcionará si redirige a un archivo>outfiley luego se ejecuta{ head -n 1; sort; } <outfileRespuestas:
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 COMMANDpuede ser más apropiado quegrep COMMAND, pero es solo un ejemplo. Además, no puede usar-Csi también usó otra opción de selección como-U.body? Como enbody sortobody grep. Pensamientos?headerabody, porque estás haciendo la acción en el cuerpo. Ojalá eso tenga más sentido.bodya todos los participantes posteriores de la tubería:ps -o pid,comm | body grep less | body sort -k1nr<foo body sort -k2obody 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.echoexpandirá la barra invertida sixpg_echose establece (no el valor predeterminado);printfEs más seguro en ese caso.echo $REPLYsin comillas condensará espacios en blanco; Creo queecho "$REPLY"debería estar bien.read -res 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_echodepende de su sistema, por ejemplo, en Solaris, creo que su valor predeterminado es verdadero. Es por eso que a Gilles le gustaprintftanto: es lo único con un comportamiento predecible.Encontré una buena versión awk que funciona muy bien en los scripts:
fuente
sortcomando 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
0todas las líneas de encabezado y1todas 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 :headlee en varias líneas desde la tubería, luego emite solo la primera. Entonces, el resto de la salida, queheadno se leyó, se pasa a - ¡sortNO 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
wcfinal 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
headincorporada de ksh93 o lalineutilidad (en sistemas que todavía tienen uno) ognu-sed -u qoIFS=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 ; } > file2solo muestra la cabezafuente
commanddos veces. Por lo tanto, se limita a algunos comandos específicos. Sin embargo, para elpscomando solicitado en el ejemplo, funcionaría.¡Simple y directo!
fuente
commanddos 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
wdos 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 +3medios 'muestran todas las líneas desde el 3 en adelante' (verman tailpara más detalles).fuente
Trata de hacerlo:
fuente