Aprendiendo A Usar Linux

Un Blog Sobre Unix – Linux

Eliminando la primera columna de un archivo con AWK

Cuando empezaba a escribir programas en mi otro blog, numeraba las filas y exportaba el archivo como html desde el editor Vim. Esto causaba que los programas se vieran más o menos así:

 1
 2
 3   // QUE HACE EL SIGUIENTE PROGRAMA?
 4 
 5 
 6   #include <iostream>
 7   using namespace::std;
 8 
 9 
10  void Alguna_Funcion ( char  b[], int Tamano )
11 
12  {
13   if ( Tamano > 0 )
14   {
15   Alguna_Funcion ( &b[1], Tamano - 1 );
16   cout << b[0] << " ";
17   }
18  }
19 
20 
21  int main()
22  {
23  const int Tamano_Arreglo = 4;
24  char A[Tamano_Arreglo] = {'H', 'O', 'L', 'A' };
25 
26  cout <<"\n\nLos valores en el arreglo son: " << endl;
27 
28  Alguna_Funcion(A, Tamano_Arreglo);
29  cout << endl;
30 
31  return 0;
32 
33  }

Esto hace fácil que uno pueda hacer referencia a una línea en particular a la hora de describir el código, sin embargo le deja al lector la tarea de suprimir la numeración de las filas para poder compilar y ejecutar el programa. Esto parece una tarea fácil, y lo es para éste ejemplo; sin embargo yo mismo tuve que hacerla para este programa que contiene más de mil líneas. Eso ya no es divertido. Además, es muy fácil alterar el código: eliminar un punto y coma, un paréntesis, cuando se hace esta labor a mano.
jarmvel me ayudó con un pequeño script en awk que me sirvió. Sin embargo, como no soy muy ordenado, y cambié de disco duro, tuve que reinventar la rueda. En realidad lo hice de una manera bastante burda, pero directa:

{print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11}

Esta línea es un programa simple en el lenguaje de programación Awk.
Todo el cuerpo del programa debe de ir encerrado entre llaves {}. Dentro, la primera instrucción es print, esta es la orden de imprimir, y lo siguiente son los argumentos de print: $2,…$11 El signo $ seguido de un número hace referencia a una columna. La columna $0 hace referencia a toda la línea. Por defecto, awk toma como columna todo lo que hay en una fila desde la aparición del primer carácter no blanco (no tabulador, no espacio) hasta la aparición del primer espacio. Así que en el código de arriba, para awk, el renglón 3 tiene 7 columnas, la línea 10, 9 y la línea 33, 2. El programa en Awk lo que hace es evaluar todas las líneas del archivo que se le dé como entrada e imprime la segunda columna, la tercera, … hasta la once. ¿Por qué hasta la columna 11? Porque en este caso, la línea 26 tiene 11 columnas. Si sólo llegáramos hasta $10 se imprimiría la esa línea, sin la numeración hasta <<.
Ahora, ¿cómo ejecutar el programa en Awk?
La forma más fácil es la siguiente:

awk '{print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11}' ProgramaIncognita.cpp

En la línea de comandos se escribe el comando awk seguido por el programa encerrado en comillas sencillas ‘ ‘, y luego el archivo que se da de entrada. La salida es la estándar.
Otra forma es guardando la línea en un archivo, digamos Programa.awk. Y luego invocarlo de la siguiente manera:

awk -f Programa.awk ProgramaIncognita.cpp

la opción -f le indica a awk que se tomarán las instrucciones del archivo cuyo nombre se escribe a continuación. Con cualquiera de las dos formas la salida es:

         
         
// QUE HACE EL SIGUIENTE PROGRAMA?    
         
         
#include <iostream>        
using namespace::std;        
         
         
void Alguna_Funcion ( char b[], int Tamano )  
         
{         
if ( Tamano > 0 )    
{         
Alguna_Funcion ( &b[1], Tamano - 1 );   
cout << b[0] << " ";    
}         
}         
         
         
int main()        
{         
const int Tamano_Arreglo = 4;     
char A[Tamano_Arreglo] = {'H', 'O', 'L', 'A' };  
         
cout <<"\n\nLos valores en el arreglo son: " << endl;
         
Alguna_Funcion(A, Tamano_Arreglo);        
cout << endl;       
         
return 0;        
         
}         

El mismo programa en C++ del principio, ahora sin la numeración al comienzo de cada línea.
Sólo para que nadie se muera de curiosidad, la salida del programa Incognita.cpp es la siguiente:

Los valores en el arreglo son: 
A L O H 
About these ads

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 1.787 seguidores

%d personas les gusta esto: