domingo, 1 de febrero de 2009

Procesamiento de Textos

Comandos simples

Existe una serie de comandos simples para realizar operaciones concretas sobre ficheros de texto
  • Ordena las líneas alfabéticamente: sort
  • Escribe partes seleccionadas de un fichero a la salida estándar: cut
  • Une texto de varios ficheros: paste
  • Formatea párrafos: fmt
  • Borra y/o reemplaza caracteres: tr
  • Elimina líneas repetidas: uniq
  • Combina varios ficheros: join
  • Divide un fichero en ficheros más pequeños: split
  • Muestra el principio/final de un fichero: head/tail
  • Muestra el fichero al revés: tac, rev
  • Muestra el número de líneas, palabras y bytes de un fichero: wc
  • Añade números de línea: nl
  • Convierte TABs en espacios: expand
  • Muestra un fichero en diferentes formatos: od
Comentaremos brevemente cada uno de ellos

sort

ordena alfabéticamente líneas de texto y las muestra en la salida estándar

Formato:

sort [opciones] fichero

Algunas opciones:

  • -b ignora blancos al principio de línea
  • -f no distingue mayúsculas/minúsculas
  • -r orden inverso
  • -m mezcla ficheros previamente ordenados
  • -n ordena numéricamente
  • -k POS1[, POS2] ordena según los campos desde POS1 o POS2, o el final si no está POS2 (el primer campo es 1)

Ejemplos:

$ cat nombres.txt
María Pérez
luis Andión
Adriana Gómez
jorge pena

$ sort nombres.txt
Adriana Gómez
María Pérez
jorge pena
luis Andión
$ sort -f nombres.txt
Adriana Gómez
jorge pena
luis Andión
María Pérez

$ sort -f +1 +0 nombres.txt
luis Andión
Adriana Gómez
jorge pena
María Pérez

$ sort -f -k 2,2 nombres.txt
luis Andión
Adriana Gómez
jorge pena
María Pérez

cut

Escribe partes seleccionadas de un fichero a la salida estándar; puede usarse para seleccionar columnas o campos de un fichero específico

Formato:

cut [opciones] fichero

Algunas opciones:

  • -b, -c, -f corta por bytes, caracteres o campos, respectivamente
  • -d fija el carácter delimitador entre campos (por defecto, TAB)

Ejemplos:

$ cat nombres-ord.txt
Luis Andión
Adriana Gómez
Jorge Pena
María Pérez
$ cut -c 1-7 nombres-ord.txt
Luis An
Adriana
Jorge P
María P

$ cut -c 1-5,9-10 nombres-ord.txt
Luis ió
AdriaGó
Jorgena
Maríare

$ cut -d ´ ´ -f 1 nombres-ord.txt
Luis
Adriana
Jorge
María

paste

Permite unir texto de varios ficheros, uniendo las líneas de cada uno de los ficheros

Formato:

paste [opciones] fichero1 [fichero2] ...

Algunas opciones:

  • -s pega los ficheros secuencialmente, en vez de intercalarlos
  • -d especifica los carácteres delimitadores en la salida (por defecto, TAB)

Ejemplos:

$ cat nombres.txt
Luis
Adriana
Jorge
María

$ cat apellidos.txt
Andión
Gómez
Pena
Pérez

$ paste nombres.txt apellidos.txt
Luis Andión
Adriana Gómez
Jorge Pena
María Pérez

$ paste -d ´ ´ nombres.txt apellidos.txt
Luis Andión
Adriana Gómez
Jorge Pena
María Pérez

$ paste -s -d ´\t\n´ nombres.txt
Luis Adriana
Jorge María

fmt

Formatea cada párrafo, uniendo o separando líneas para que todas tengan el mismo tamaño

Algunas opciones:

  • -n o -w n pone la anchura de las líneas a n (por defecto, 75)
  • -c conserva la indentación a principio de línea y alinea a la izquierda la segunda línea
  • -s las líneas pueden dividirse, no unirse
  • -u uniformiza el espaciado entre palabras

Ejemplo:

$ cat quijote.txt
En un lugar de la Mancha, de cuyo nombre no
quiero acordarme, no ha mucho tiempo
que vivía un
hidalgo de los de lanza en astillero, adarga
antigua, rocín flaco y galgo corredor.

$ fmt -w 45 -u quijote.txt
En un lugar de la Mancha, de cuyo nombre
no quiero acordarme, no ha mucho tiempo
que vivía un hidalgo de los de lanza en
astillero, adarga antigua, rocín flaco y
galgo corredor.

tr

Borra caracteres o reemplaza unos por otros

Formato:

tr [opciones] set1 set2

Algunas opciones:

  • -d borra los caracteres especificados en set1
  • -s reemplaza caracteres repetidos por un único carácter

Ejemplos:

$ tr ´a-z´ ´A-Z´ < quijote.txt
EN UN LUGAR DE LA MANCHA, DE CUYO NOMBRE...
$ tr -d ´ ´ < quijote.txt
EnunlugardelaMancha,decuyonombre...
$ tr au pk < quijote.txt
En kn lkgpr de lp Mpnchp, de ckyo nombre...
$ tr lcu o < quijote.txt | tr -s o
En on ogar de oa Manoha, de oyo nombre

uniq

Descarta todas (menos una) las líneas idénticas sucesivas en el fichero

Formato:

uniq [opciones] fichero

Algunas opciones:

  • -d muestra las líneas duplicadas (sin borrar)
  • -u muestra sólo las líneas sin duplicación
  • -i ignora mayúsculas/minúsculas al comparar
  • -c muestra el número de ocurrencias de cada línea
  • -s n no compara los n primeros caracteres
  • -f n no compara los n primeros campos
  • -t c usa el carácter c como separador de campos (por defecto, espacio o tabulado)

Ejemplo:

$ cat nombres.txt
Julio Lorenzo
Pedro Andión
Celia Fernández
Celia Fernández
Juan Fernández
Enrique Pena

$ uniq nombres.txt
Julio Lorenzo
Pedro Andión
Celia Fernández
Juan Fernández
Enrique Pena

$ uniq -f 1 -c nombres.txt
1 Julio Lorenzo
1 Pedro Andión
3 Celia Fernández
1 Enrique Pena

join

Permite combinar dos ficheros usando campos: busca en los ficheros por entradas comunes en el campo y une las líneas; los ficheros deben estar ordenados por el campo de unión

Formato:

join [opciones] fichero1 fichero2

Algunas opciones:

  • -i ignora mayúsculas/minúsculas
  • -1 FIELD une en el campo FIELD (entero positivo) de fichero1
  • -2 FIELD une en el campo FIELD de fichero2
  • -j FIELD equivalente a -1 FIELD -2 FIELD
  • -t CHAR usa el carácter CHAR como separador de campos
  • -o FMT formatea la salida (M.N fichero M campo N, 0 campo de unión)
  • -v N en vez de la salida normal, muestra las líneas que no se unen del fichero N
  • -a N además la salida normal, muestra las líneas que no se unen del fichero N

Ejemplo:

$ cat nombres1.txt
Luis Andión
Adriana Gómez
Jorge Pena
María Pérez

$ cat nombres2.txt
Pedro Andión
Celia Fernández
Julio Lorenzo
Enrique Pena

$ join -j 2 nombres1.txt nombres2.txt
Andión Luis Pedro
Pena Jorge Enrique

$ join -j 2 -o 1.1 2.1 0 nombres1.txt nombres2.txt
Luis Pedro Andión
Jorge Enrique Pena

split

Divide un fichero en ficheros más pequeños; los ficheros más pequeños se nombran a partir del prefijo especificado (prefijoaa, prefijoab,...)

Formato:

split [opciones] fichero prefijo
Si no se pone fichero, o se pone - se lee la entrada estándar

Algunas opciones:

  • -l n pone n lineas en cada fichero de salida (por defecto 1000)
  • -b n pone n bytes en cada fichero de salida
  • -C n pone en cada fichero de salida tantas líneas completas como sea posible sin sobrepasar n bytes
  • -d usa números en vez de letras para el nombre de los ficheros de salida

Ejemplo:

$ split -l 2 quijote.txt quij
$ ls quij*
quijaa quijab quijac quijote.txt
$ cat quijaa
En un lugar de la Mancha, de cuyo nombre
no quiero acordarme, no ha mucho tiempo

$ cat quijac
galgo corredor.
$ split -l 2 -d quijote.txt quij
$ ls quij*
quij00 quij01 quij02 ...

head

Muestra el principio de un fichero

Formato:

head [opciones] fichero

Algunas opciones:

  • -n N ó -N muestra las primeras N líneas
  • -c N muestra los primeros n bytes
  • -v le añade una línea de cabecera, con el nombre del fichero

Ejemplo:

$ head -n 2 -v quijote.txt
==>quijote.txt <==
En un lugar de la Mancha, de cuyo nombre
no quiero acordarme, no ha mucho tiempo

tail

Muestra el final de un fichero

Algunas opciones:

  • -n N ó -N muestra las últimas N líneas (por defecto, 10)
  • +N muestra de la línea N al final
  • -c N muestra los últimos N bytes
  • -f hace que tail corra en un lazo, añadiendo líneas a medida que el fichero crece (útil para cuando queremos ver como se modifica un fichero)
  • --retry útil con -f; aunque el fichero no exista o sea inaccesible continua intentando hasta que puede abrirlo
  • -v le añade una línea de cabecera, con el nombre del fichero

Ejemplo:

$ tail -n 2 -v quijote.txt
==>quijote.txt <==
astillero, adarga antigua, rocín flaco y
galgo corredor.

tac, rev

tac imprime el fichero de la última a la primera línea (opuesto a cat); rev invierte las lineas del fichero

Ejemplos:

$ tac quijote.txt
galgo corredor.
astillero, adarga antigua, rocín flaco y
que vivía un hidalgo de los de lanza en
no quiero acordarme, no ha mucho tiempo
En un lugar de la Mancha, de cuyo nombre

$ rev quijote.txt
erbmon oyuc ed ,ahcnaM al ed ragul nu nE
opmeit ohcum ah on ,emradroca oreiuq on
ne aznal ed sol ed ogladih nu aíviv euq
y ocalf nícor ,augitna agrada ,orellitsa
.roderroc oglag

wc

Muestra el número de líneas, palabras y bytes de un fichero

Formato:

wc [opciones] fichero

Algunas opciones:

  • -l muestra sólo el número de lineas
  • -w muestra sólo el número de palabras
  • -c muestra sólo el número de bytes
  • -L muestra la longitud de la línea más larga

Ejemplo:

$ wc quijote.txt
5 33 178 quijote.txt
$ wc -l quijote.txt
5 quijote.txt
$ wc -w quijote.txt
33 quijote.txt
$ wc -c quijote.txt
178 quijote.txt

nl

Añade números de línea; nl considera los ficheros separados en páginas lógicas, cada una de ellas con una cabecera, cuerpo y pie, cada una de estas secciones se numera de forma independiente, y la numeración se reinicia para cada página; los comienzos de cabecera, cuerpo y pie de cada página se marcan, respectivamente, con \:\:\:, \:\: y \:

Formato:

nl [opciones] fichero

Algunas opciones:

  • -b, -h o -f ESTILO indica el estilo de numeración para cuerpo, cabecera o pie, que puede ser:
    • a: numera todas las líneas
    • t: numerar sólo las líneas no vacías (por defecto para el cuerpo)
    • p REGEXP: numera sólo las líneas que concuerdan con REGEXP
    • n: no numera ninguna línea (por defecto para cabecera y pie)
  • -v n inicia la numeración en n (por defecto, 1)
  • -i n incrementa los números por n (por defecto, 1)
  • -p no reinicia la numeración al principio de cada página
  • -s STRING una STRING para separar los números de línea del texto (por defecto ´ ´)

Ejemplo:

$ nl -s ´q ´ quijote.txt
1q En un lugar de la Mancha, de cuyo nombre
2q no quiero acordarme, no ha mucho tiempo
3q que vivía un hidalgo de los de lanza en
4q astillero, adarga antigua, rocín flaco y
5q galgo corredor.

expand

Convierte TABs en espacios; útil debido a que la representación del TAB puede ser diferente en distintos sistemas

Formato:

expand [opciones] fichero ...

Algunas opciones:

  • -t n reemplaza cada TAB por n espacios (por defecto, 8)
  • -i solo reemplaza los TABs de principio de línea

Ejemplos:

$ cat hola.c
main() {
for(i=0; i<10;i++)
printf("Hola mundo!\n");
}
$ expand -t 2 hola.c
main() {
for(i=0; i<10;i++)
printf("Hola mundo!\n");
}
El comando unexpand hace la operación contraria

od

Muestra un fichero en octal, hexadecimal o otros formatos; en cada línea muestra (en la primera columna) el offset

Formato:

od [opciones] fichero

Algunas opciones:

  • -t TIPO especifica el formato de la salida (por defecto octal): o para octal, x para hexadecimal, d para decimal, c para caracteres ASCII, a para caracteres con nombre...
  • -A TIPO especifica el formato del offset (por defecto octal): o, x, d como antes, n para que no aparezca
  • -w BYTES número de bytes por linea (por defecto 16)

Ejemplo:

$ od -t x -A x quijote.txt
000000 75206e45 756c206e 20726167 6c206564
000010 614d2061 6168636e 6564202c 79756320
000020 6f6e206f 6572626d 206f6e0a 65697571
...