Manipulando tablas numéricas

El siguiente ejemplo intercambia la primera y ultima columnas de un fichero como el que sigue:
$ cat columns.test
11111 22222 33333 44444 55555
  111    22    33  4444  5555
11111 22222 33333 44444 55555
   11    22     3   444  5555
La parte mas complicada es preservar el sangrado. El truco reside, en parte, en el patrón central $ \backslash$2, que memoriza los blancos después de la primera columna y un sólo blanco antes de la última.
$ cat columns.sed
s/^\( *[0-9][0-9]*\)\( .*[0-9] \)\( *[0-9][0-9]*\)$/\3\2\1/
$ sed -f columns.sed columns.test
55555 22222 33333 44444 11111
 5555    22    33  4444   111
55555 22222 33333 44444 11111
 5555    22     3   444    11
El siguiente ejemplo utiliza una opción del operador de sustitución que permite decidir que aparición del patrón deseamos sustituir. Asi,

s/A/B/3

sustituirá la 3 aparición de A por B, obviando las otras.

El ejemplo selecciona la columna dos del fichero:

$ cat col2.sed
#extracts the second column
s/^  *//
s/\<[0-9][0-9]*\>//1
s/\<[0-9][0-9]*\>//2
s/\<[0-9][0-9]*\>//2
s/\<[0-9][0-9]*\>//2
s/  *$//
$ sed -f col2.sed columns.test
 22222
    22
 22222
    22
Mas general que el anterior, el siguiente ejemplo elimina un número de columnas arbitrario $1 por la izquierda y otro número $2 por la derecha. Para lograrlo, es necesario utilizar un un guión para la shell que llama al correspondiente guión sed. Los parámetros son introducidos en el guión sed mediante el uso apropiado de las comillas dobles y simples:

> cat colbranch.sh
#!/bin/bash
sed -e '
s/^\( *[0-9]\+\)\{'"$1"'\}//
s/\( *[0-9]\+\)\{'"$2"'\}$//
'
Veamos un ejemplo de uso:
> cat columns.test
11111 22222 33333 44444 55555
  111    22    33  4444  5555
11111 22222 33333 44444 55555
   11    22     3   444  5555
> colbranch.sh 2 1 < columns.test
 33333 44444
    33  4444
 33333 44444
     3   444

Casiano Rodríguez León
2013-04-23