Transponer múltiples registros con awk
Frecuentes
Visto 98 equipos
1
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
4 Respuestas
1
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
0
$ 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
0
¿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
0
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 php bash awk or haz tu propia pregunta.
¿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