Transponer múltiples registros con awk

Estoy tratando de transponer la salida de mi programa torrent Deluge a algo que pueda poner en columnas en un archivo php.

La salida de información de la consola de diluvio se ve así (ejemplo):

Name: 2014-01-07-wheezy-raspbian.zip
ID: ebd9f05d220e7afd62fcbb10743bf9210a59efd5
State: Seeding Up Speed: 0.0 KiB/s
Seeds: 0 (10) Peers: 0 (0) Availability: 0.00
Size: 780.0 MiB/780.0 MiB Ratio: 17.988
Seed time: 10 days 16:29:52 Active: 10 days 17:44:08
Tracker status: raspberrypi.org: Announce OK

Name: ArchLinuxARM-2014.01-rpi.img.zip
ID: d8b3fb8bf7064108d26390d8a3ec586b70182e18
State: Seeding Up Speed: 0.0 KiB/s
Seeds: 0 (3) Peers: 0 (0) Availability: 0.00
Size: 182.7 MiB/182.7 MiB Ratio: 8.222
Seed time: 10 days 16:05:32 Active: 10 days 16:49:27
Tracker status: raspberrypi.org: Announce OK

¿Cómo puedo usar awk para obtener algo como esto:

Name                            State    Ratio   Size
2014-01-07-wheezy-raspbian....  Seeding  17.988  780.0 MB
ArchLinuxARM-2014.01-rpi.im...  Seeding   8.222  182.7 MB

Sé que tengo que usar las diferentes variables de entrada y salida para que esto suceda, pero siendo un novato en awk, esperaba una pequeña ayuda inicial.

La consola se ve así cuando se ejecuta el comando: http://www.tiikoni.com/tis/view/?id=e34da2a

preguntado el 12 de febrero de 14 a las 07:02

4 Respuestas

Puedes usar este awk:

awk -F ': *| +' '$1 ~ /Name|Size|State/{a[$1]=$2}
   NF > 1 && $(NF-1) ~ /Ratio/{
     printf "%-40s %-15s %10s %10s MB\n", a["Name"], a["State"], $NF, a["Size"];
     delete a; next}' file

2014-01-07-wheezy-raspbian.zip           Seeding             17.988      780.0 MB
ArchLinuxARM-2014.01-rpi.img.zip         Seeding              8.222      182.7 MB

Respondido 12 Feb 14, 08:02

¿Cómo funciona la variable "archivo" en este código? - geirawsm

El archivo es el nombre del archivo de entrada aquí, así que simplemente reemplácelo con su nombre de archivo de registro real. - anubhava

Ah, no hay salida de archivo de registro per se, solo el resultado de un comando de terminal. He puesto una captura de pantalla del resultado del comando en mi publicación original como referencia. - geirawsm

En ese caso, solo canaliza y ordena awk como: your-command | awk -F ': *| +' '$1 ~ /Name|Size|State/{a[$1]=$2} NF > 1 && $(NF-1) ~ /Ratio/{printf "%-40s %-15s %10s %10s MB\n", a["Name"], a["State"], $NF, a["Size"]; delete a; next}' - anubhava

$ awk -v RS= '{print $2, $6, $24, $20, "MB"}' file
2014-01-07-wheezy-raspbian.zip Seeding 17.988 780.0 MB
ArchLinuxARM-2014.01-rpi.img.zip Seeding 8.222 182.7 MB

Use printf en lugar de imprimir para formatear como desee.

Respondido 12 Feb 14, 12:02

¿Por qué no quieres usar php en sí?

<body>
<table border=1>
<tr>
    <td>Name</td>
    <td>State</td>
    <td>Ratio</td>
    <td>Size</td>
</tr>
<?php
$output=array();
exec("FULL_PATH_TO_DELUGE_CONSOLE/deluge-console info",$output);
$raw=explode("\n", $output);
foreach ($raw as $row)
{
    $resultset=explode(' ',$row);
    switch ($resultset[0])
    {
        case 'Name:':
            $name=$resultset[1];
            break;
        case 'State:':
            $state=$resultset[1];
            break;
        case 'Size:':
            $size=$resultset[1];
            $ratio=$resultset[5];
            echo '<tr><td>'.$name.'</td><td>'.$state.'</td><td>'.$ratio.'</td><td>'.$size.'</td></tr>';
            break;
    }
}
?>
</table>
</body>

Respondido 12 Feb 14, 13:02

Tengo muy poca experiencia con php, esperaba usar solo awk e implementar el código en una copia de los otros módulos que ya están en el proyecto. Sin embargo, esto podría ayudar. ¿Solo tengo que agregar <?php en la parte superior de este texto para convertirlo en un archivo php funcional? - geirawsm

Agrego algo de código. Ahora simplemente puede copiar este código en un archivo .php vacío. No olvides cambiar FULL_PATH_TO_FILE a la ruta completa del archivo de salida de torrent. - rjhdby

Ah, no hay un archivo de salida per se, solo un comando que puedo ejecutar para obtener esa información. He incluido una imagen en mi publicación original para aclaración. He buscado en los otros módulos-php-archivos en el proyecto, y parece que muchos de ellos están configurando variables que son exec() de un comando bash. - geirawsm

dropbox.com/s/bm2kz05jnrdx3f7/deluge-console.png Esta pagina web no esta disponible - rjhdby

solo un comando que puedo ejecutar para obtener esa información. Usar redirección 'comando 1>archivo de salida'- rjhdby

con awk

deluge-console info|awk '$1=="Name:" {name=$2} $1=="State:" {state=$2} $1=="Size:" {print name,state,$6,$2}' >output_file

Respondido 12 Feb 14, 13:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.