Mar
22
Jul

AWK: Pasar texto a minúsculas/mayúsculas


Lo bueno de aprender AWK es que al tenerlo fresco, se convierte en una herramienta de uso diario en el shell. Últimamente lo uso mucho, por ejemplo hoy, lo usé en el siguiente caso que les voy a plantear. Necesitaba pasar un texto a minúsculas, que era algo que no sabía cómo hacer, hasta que lo necesité. En verdad tenía un archivo de texto (items.txt) lleno de datos con el siguiente formato:

* TITULO DEL ITEM - Descripción del ítem.

Lo que necesitaba era obtener una lista así:
titulo del item 1, titulo del item 2, ... , titulo del item n.
Y obviamente, lo primero que se me ocurrió fue usar AWK.

<conceptosAWK>
AWK es un lenguaje de programación interpretado orientado a datos. Recibe texto como entrada, y trabaja con eso. Ejecuta una acción por cada línea de texto, y a su vez, cada dato “separado” en esa linea de texto es un registro al que se accede con $1, $2, … , $n.
El separador de registros es importante. Por defecto toma el espacio como separador.
</conceptosAWK>

En este archivo en particular, opté empezar por separar el título de su descripción. Primero proceso el archivo para eliminar lo que hay después del guión. Para eso especifico que el separador de campo sea el guión “-”:

awk 'BEGIN{FS="-"}{print $1}' items.txt > resultado.txt

Lo que estoy haciendo acá, es especificando que separe los registros por “-”. Entonces $1 va a ser “* TITULO DEL ITEM” y $2 va a ser “Descripción del ítem.“. Le paso como parámetro items.txt, y voy guardando el resultado en resultado.txt. (Redirijo la salida del awk con “>” a un archivo de texto resultado.txt).

El archivo resultado.txt me queda con el formato: “* TITULO DEL ITEM” para cada ítem. Ahora lo paso a minúsculas, y de paso saco el asterisco que no lo necesito:

awk 'BEGIN{FS="*"}{print tolower($2", ")}' $2

Me quedó algo así:
titulo del item 1 , titulo del item 2 , … , titulo del item n ,
Ahora, lo que tengo que hacer sacar el espacio antes de las comas, para eso puedo usar SED:

sed s/\ ,/,/

Reemplazo los ” ,” con “,” y listo. El archivo quedó:
titulo del item 1 , titulo del item 2 , … , titulo del item n ,

Me hice un script, que recibe como parámetros dos archivos. El primer parámetro $1, es el archivo que hay que editar, y el segundo parámetro $2 va a ser el resultado:

#!/bin/bash
awk 'BEGIN{FS="-"}{print $1}' $1 > $2
echo `awk 'BEGIN{FS="*"}{print tolower($2", ")}' $2` > $2
echo `sed s/\ ,/,/ $2` > $2

Lo novedoso, por lo menos para mí, fue el uso de la función “tolower” en AWK. Así que para pasar un texto a minúsculas o a mayúsculas de forma bien sencilla, simplemente hay que usar esta función. Idem para pasar a mayúsculas: toupper. Los scripts quedarían algo así:

Para pasar todo el texto a minúsculas:

tolower.sh
#!/bin/bash
echo $@ | awk '{print tolower($0)}'
#Este script pasa a minúsculas todos los parámetros que reciba.

Para pasar todo el texto a mayúsculas:

toupper.sh
#!/bin/bash
echo $@ | awk '{print toupper($0)}'
#Este script pasa a mayúsculas todos los parámetros que reciba.

O directamente, si se acuerdan cómo usar AWK, lo más rápido es hacerlo derecho desde consola.

Y tá, eso es lo que estuve haciendo en un rato. Como estuvo divertido, lo documenté por acá :P
En una de esas a alguien le sirve.


Si te gustó éste post, podés apoyar a PicandoCódigo a través de PayPal!

8 Comentarios para “AWK: Pasar texto a minúsculas/mayúsculas”

  1. Rodolfo Pilas a las 10:25 pm 22 Julio. 2008
    Firefox 3.0GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062517 Firefox/3.0

    No te voy a negar que con awk se puede hacer, pero bueno… LA herramienta para esto es tr:

    tr [:upper:] [:lower:] resultado.txt

    Saludetes.

  2. Rodolfo Pilas a las 10:26 pm 22 Julio. 2008
    Firefox 3.0GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062517 Firefox/3.0

    Ah! miercoles, no le gustó al coso este las redirecciones en blockquote… va con etiquetas code:

    tr [:upper:] [:lower:] resultado.txt

  3. Rodolfo Pilas a las 10:28 pm 22 Julio. 2008
    Firefox 3.0GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062517 Firefox/3.0

    jajajajaa!! con etiquetas code tampoco!!! cool!

    tr [:upper:] [:lower:] (simbolo-menor) items.txt (simbolo-mayor) resultado.txt

  4. fernando a las 10:34 pm 22 Julio. 2008
    Debian IceWeasel 3.0.1Debian GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071618 Iceweasel/3.0.1 (Debian-3.0.1-1)

    Rodolfo:
    Gracias por el aporte. En verdad había encontrado la forma de hacerlo con tr, así tal cual mencionas, pero me resultó más divertido AWK :P
    Creo que no hay forma de poner los símbolos de mayor y menor, siempre tengo problema con eso:
    Usando code:"< "
    Usando pre:

    < 

    Usando "<": <

  5. fernando a las 10:35 pm 22 Julio. 2008
    Debian IceWeasel 3.0.1Debian GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071618 Iceweasel/3.0.1 (Debian-3.0.1-1)

    Bueno, con los tags “<pre>” anda, también escribiendo el equivalente al símbolo en HTML: & l t ; y & g t ;
    (Si los pongo juntos me escribe <>)

  6. Fabio R Panettieri a las 12:20 pm 23 Julio. 2008
    Firefox 3.0GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9) Gecko/2008061015 Firefox/3.0

    Ya se que es un post de AWK pero justo recien hice un scriptcito en python para hacer justo eso, y lo queria compartir

    Espero que no l otomen a mal, y que sirva para aportar

    #!/usr/bin/env python
    import sys
    try:
        input = open(sys.argv[1], 'r')
        str = input.read()
    except Exception, exp:
        print "Error opening %s : %s" % (sys.argv[1], exp)
    finally:
        input.close()
     
    if str:
        str = str.lower()
        try:
            output = open(sys.argv[2], 'w')
            output.write(str)
        except Exception, exp:
            print "Error opening %s : %s" % (sys.argv[2], exp)
        finally:
            output.close()
  7. fernando a las 1:23 pm 23 Julio. 2008
    Debian IceWeasel 3.0.1Debian GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071618 Iceweasel/3.0.1 (Debian-3.0.1-1)

    Fabio, por el contrario, se agradece mucho tu aporte! Gracias por compartirlo :D

Trackbacks y pingbacks:

  1. [...] recientes fernando on AWK: Pasar texto a minúsculas/mayúsculasJulián Franco on El regreso de Los FarzantesFabio R Panettieri on AWK: Pasar texto a [...]

Dejar un comentario

Al agregar un comentario en esta página, usted acepta la siguiente licencia para su publicación:
Creative Commons License Creative Commons Attribution-Share Alike 3.0 Unported License.




Si quieres mostrar código, enciérralo entre los tags pre de esta forma:
<pre lang="L"> y </pre>, donde L es un lenguaje compatible GeSHI. Más info.

XHTML: Las siguientes tags están permitidas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">


Additional comments powered by BackType

Búsqueda personalizada