13/9/08

Un poco de Awking

Awk es el dios de la manipulacion de texto automatica, es onda sed pero (desde mi punto de vista y conocimientos) mucho mejor. Por ejemplo yo queria que el irssi con un alias (osea que llame a bash con /exec porque de perl no entiendo un pomo) que diga el tema que estoy escuchando con MOCP, el output de mocp -i es algo asi:

State: PLAY
File: /home/alvare/Desktop/Ezequiel-Win32/Music 2.3/Punk/rage against the machine - calm like a bomb.mp3
Title: Rage Against The Machine - Calm Like A Bomb (Matrix Reloaded)
Artist: Rage Against The Machine
SongTitle: Calm Like A Bomb
Album: Matrix Reloaded
TotalTime: 04:58
TimeLeft: 04:46
TotalSec: 298
CurrentTime: 00:12
CurrentSec: 12
Bitrate: 192Kbps
AvgBitrate: 192Kbps
Rate: 44KHz



Entonces lo primero que hice fue esto:

echo "Escuchando: `basename \"\$(mocp -i | awk '/^File/ {print $0}' | cut -d\" \" -f 2-100)\"`" | sed s/'.mp3'/''/g


Que es absurdamente largo y complicado y no vale la pena explicar.

Despues hice esto:

mocp -i | awk -F/ 'NR == 2{gsub("\.mp3","");print "Listening:",$NF}'

Que es exageradamente mas sencillo xP y me da este output:

"Listening: rage against the machine - calm like a bomb"



Que hace esta cosa? mocp -i lo pipea a awk que hace su "magia", elige el renglon 2, donde dice el Filename y despues al decirle con -F'/' el se cree que las palabras estan separadas por / , entonces le digo que imprima la ultima palabra, que vendria a ser el nombre del archivo, porque sino pondria todo el path del archivo (con gsub le saco el ".mp3").

Otra experiencia Awkeante que tuve fue cuando consegui de "terceros" 2 CDs de Queen, Bests Hits I y II. Todos los archivos .mp3 venian con este formato por ejmplo:

Queen(GreatestHitsI)-(9)BohemienRapsody.mp3


Y esto era muy molesto al leer los nombres de los temas, asi que me decidi a cambiar eso automaticamente.
Que resulto de esto? Este simple comandillo:

for A in *.mp3 ; do mv $A "$(echo $A | awk '{gsub(/\(.*\)/,"");print}'|sed 's/Q/q/'|sed 's/[A-Z]/ &/g')"


Que hace esto ?? Facil, el for es facil, le da a $A el valor de cada uno de los archivos .mp3 y los pasa a mv, aca mv los mueve de $A a $A pasado por una combo de Awk y sed. Esta combo 1º borra toda la mierda entre ( y ), entonces me queda QueenBohemienRapsody.mp3. Luego cabmia las Q por q y despues cambia todas las mayusculas por esa misma letra con un espacio atras, se entiende?
Si tenias "QueenPocholo.mp3" te queda " Queen Pocholo.mp3", pero como transforme las Q en q solo me añade los otros espacios, eso me da "queen Bohemien Rapsody.mp3" que es lo que quiero lograr.

Antes de irme a jugar al UrT quiero aclarar que esto en windows es totalmente imposible usando las herramientas nativas o de DOS (total no fue hecho para ser usado por gente conciente). Cuando usaba Windows me acuerdo que si algo no me gustaba como estaba lo dejaba asi, porque otra no tenia, ahora como puedo hacer todo (menos escribir drivers para webcams) eso no me pasa mas, y ahora siempre que veo un problema, tanto en la vida como en la PC, busco la forma de resolverlo (usando pipes en lo posible).
-------Viva BASH y muera Microsoft !

PS:Una banda de Heavy que tiene cierto agrado por windows y su mejor amiga, la BSoD