Fecha de última modificación:

4 Abril, 2015 - 02:12

awk

Su sintaxis es de la forma:
awk /patrón/ {acción}

Lee la entrada un renglón a la vez, cada renglón se compara con cada patrón en orden; para cada padrón que concuerde con el renglón se efectúa la acción correspondiente. Si se omite la acción, la acción por defecto consiste en imprimir los renglones que concordaron con el patrón y si se omite el patrón, la parte de la acción se hace en cada renglón de entrada. awk divide cada renglón de entrada en campos, (por defecto) cada campo estará separado por espacios, llama a los campos $1, $2, ..$NF donde NF es una variable cuyo valor es igual al número de campos. Los patrones deben ir rodeados por caracteres / y puede contener dos patrones separados por una coma, en cuyo caso la acción se realizará para aquellas líneas comprendidas entre la primera aparición del primer patrón y la siguiente aparición del segundo patrón.

NR variable igual número de línea actual.

FILENAME nombre del archivo de la entrada.

-F especificamos que carácter queremos que tome como separador de campos.

BEGIN realiza acciones antes de procesar entrada por ejemplo: awk 'BEGIN {FS =":"}' el carácter separador será dos puntos :


awk '{print $1","}' pp agrega un coma (,) al final del primer campo.

# cat pp
      3 hola
      2 pepe
      2 mama
      1 www
      1 si
      1 no
# awk '{print $1","}' pp
3,
2,
2,
1,
1,
1,

awk '{print $0","}' pp agrega un coma (,) al final de cada línea.

# awk '{print $0","}' pp
      3 hola,
      2 pepe,
      2 mama,
      1 www,
      1 si,
      1 no,

awk '$1 ~ /1/' ppmuestra todas las líneas cuyo primer campo contenga la cadena 1.

# awk '$1 ~ /1/' pp
      1 www
      1 si
      1 no

awk '$2 ~ /a/' pp muestras todas las líneas cuyo segundo campo contenga la letra a

# awk '$2 ~ /a/' pp
      3 hola
      2 mama

awk '$2 !~ /a/' pp busca todas las líneas cuyo segundo campo no contenga la letra a

# awk '$2 !~ /a/' pp
      2 pepe
      1 www
      1 si
      1 no

awk '/pepe/' ejemplo.txt busca todas las líneas que contenga la cadena pepe es equivalente a ejecutar grep pepe ejemplo.txt

# cat ejemplo.txt
mama
pepe
hola
Hola
pepe
Hola
si
no
Mama
www
# awk '/pepe/' ejemplo.txt
pepe
pepe
# grep pepe ejemplo.txt
pepe
pepe

awk '/pepe/,/si/' ejemplo.txt busca todas las líneas existentes entre los patrones pepe y si

# awk '/pepe/,/si/' ejemplo.txt
pepe
hola
Hola
pepe
Hola
si

ifconfig | awk /192/ es equivalente a ejecutar ifconfig | grep 192

# ifconfig | awk /192/
          inet addr:192.168.1.6  Bcast:192.168.1.255  Mask:255.255.255.0

ifconfig | awk '/192./ {print $2}'| awk -F: '{print $2}' muestra la dirección IP (si esta empieza por 192.)

# ifconfig | awk '/192./ {print $2}'| awk -F: '{print $2}'
192.168.1.6

awk '{if(length($0) < 12) print}' pp muestra todas las lineas que contengan menos de 12 caracteres.

# cat pp
      3 hola
      2 pepe
      2 mama
      1 www
      1 si
      1 no
# awk '{if(length($0) < 12) print}' pp
      1 www
      1 si
      1 no

awk '$2 ~ /si/ {if(length($0) < 12) print}' archivo.txt muestra todas las líneas mayores a 12 caracteres, cuyo segundo campo contenga la cadena si.

# awk '$2 ~ /si/ {if(length($0) < 12) print}' pp
      1 si

awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print "" }' ejemplo2.txt elimina las columnas repetidas (consecutivas o no) en cada una de las filas del archivo ejemplo2.txt

# cat ejemplo2.txt 
1 1 1 2 1 2 3
5 5 4 1 2 3 3
# awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print "" }' ejemplo2.txt
1 2 3 
5 4 1 2 3 

awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : "ñññ"; i=split("",a); print "" }' archivo.txt | grep -v "ñññ" > sinrepetir.txt remplaza donde haya una palabra que se repetida por ñññ esto nos permita luego hacer: grep -v "ññññ" para eliminar esas lineas (elimina las lineas que tienen palabras repetidas).

awk -v IGNORECASE=1 '$1 ~ /Bisuteria/' t2 similar a ejecutar grep -i "^bisuteria" t2

substr(s,m,n) produce la subcadena s que comienza en la posición m y mide n caracteres de largo, si n se omite la subcadena se extiende hasta el final de la línea.

awk '{if(length($0) > 72) print "línea", NR, "muy larga:", substr($0,1,60)}' pepe.txt si alguna de las lineas de pepe.txt contiene más de 72 caracteres desplegará mostrando: línea xxx muy larga: acá mostraría parte de la línea.

# ls -l
total 116
-rw-r--r-- 1 root root    51 abr  4 01:56 ejemplo2.txt
-rw-r--r-- 1 root root    28 abr  4 01:15 ejemplo2.txt~
-rw-r--r-- 1 root root    45 abr  3 23:35 ejemplo.txt
-rw-r--r-- 1 root root    45 abr  3 23:28 ejemplo.txt~
-rwxrwxrwx 1 root root 18959 abr  3 21:41 lista
-rw-r--r-- 1 root root 18959 abr  3 22:05 lista-ordenada
-rwxrwxrwx 1 root root 21599 abr  3 21:25 lista palabras.txt~
-rwxrwxrwx 1 root root    83 abr  3 21:06 notas.txt
-rwxrwxrwx 1 root root  9769 abr  3 21:13 Nuevo Hoja de cálculo de Microsoft Office Excel.xlsx
-rw-r--r-- 1 root root  7738 abr  3 22:08 p1
-rw-r--r-- 1 root root   228 abr  3 22:53 pepe.txt
-rw-r--r-- 1 root root   228 abr  3 22:51 pepe.txt~
-rw-r--r-- 1 root root    73 abr  3 23:47 pp
# ls -l | awk '{if(length($0) > 72) print "línea", NR, "muy larga:", substr($0,1,60)}'
línea 10 muy larga: -rwxrwxrwx 1 root root  9769 abr  3 21:13 Nuevo Hoja de cál

awk -F":" '{print $2}' establecemos que el carácter separador será dos puntos : lo cual es equivalente a ejecutar awk 'BEGIN {FS = ":" } {print $2}'


Nota: Recurada que el archivo debe estar en formato UNIX, para ello puedes usar: dos2unix -n pp-dos.txt pp-unix.txt

Un comando relacionado es sed

Para más detalles recomiendo el siguiente manual o ver estos ejemplos de uso del comando awk

Leer más sobre: 

¿Te resulto útil?: 

5

Comentarios

hola primero tu tutorial de lo mejor que e encontrado en internet. Quiero hacerte una pregunta sobre un pequeno problema que tengo y quiero solucionarlo con awk. Primero El archivo tiene el siguiente formato:
sp_a.sql
AA select
BB select
CC select
sp_b.sql
sp_c.sql
sp_d.sql
D_aa select
Lo que necesito:
sp_a.sql
AA select
BB select
CC select
sp_d.sql
D_aa select
Eliminando las lineas que
sp_b.sql
sp_c.sql

Respuesta:
awk '{ if ( $1 != "sp_b.sql" &amp;&amp; $1 != "sp_c.sql" ) print $0; }' archivi.txt

Como cambiar la "ñ" por "n" en script ??

como cambiar la "ñ" por "n" en script?????????

sed 's/ñ/n/g'

Hola quiero decir que es un excelente tutorial muy bien detallado, sin embargo me he topado con problema y quiero resolverlo con awk, podrìan apoyarme es lo siguiente:

Tengo un archivo f1.txt con los siguientes registros:
1
2
4
5

Y un archivo 2 con los siguientes datos

1 pera
3 fresa
4 manzana
5 pera
6 piña
7 cereza

Al final quiero obtener un archivo f3.txt con los siguientes datos:
3 fresa
6 piña
7 cereza

vas a necesitar un archivo archivo.awk y luego tendras que hacer el awk de la siguiente manera awk -f archivo.awk fichero1.txt fichero2.txt &gt; fichero3.txt
el contenido de archivo.awk es (case sensitive es decir respeta mayus y minus):
BEGIN{FS=" ";cont=0}
{
noEsta="true"
if($2==""){
num[cont]=$1
cont++
}else{
for(x=0;x&lt;=cont;x++){ if(num[x]==$1){noEsta="false"}}
if(noEsta=="true"){
#Dos opciones
printf("La fruta %s tiene el número %d \n",$2,$1)
# ó
#print $1,$2
}
}
}
END{}

Buenos días, perdón por molestar pero tengo un problema en el trabajo y le doy vueltas pero nada... Recibo un txt con un numero movil y otro fijo separado por ; (punto y coma) Necesito comprobar que los del primer campo empiecen por 6 o 7 y los del 2 por 9 u 8 y el resultado tenerlo en nuevo txt. Me podes ayudar?

holas disculpa tengo una duda...veras tengo de un archivo txt coger la primera fila y luego remplazar toda esa fila con una palabra de otro txt...como lo hago..???

Hola muy buenas!! Les comento tengo un fichero que viene con 2 columnas, una telefono y la otra fecha. Se me esta haciendo muy dificil validar la fecha dentro del awk. Esto es lo que tengo:
awk -F "|" '{
if ( length ($1) != 9 || ( ( substr($1,1,1) != 9 &amp;&amp; substr($1,1,1) != 8 ) ) ) {
print "Error en telefono - " $0;
} else if ( $2 !~ /[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9][0-9][0-9]/ )
print "Error en fecha - "$0;
else
print $0;
}' archivo
pero claro en la fecha si me ponen el mes 13 pasa igual y eso no es correcto. Podrían ayudarme??

Buenas Tardes:

Tengo el siguiente texto:

BOALCALHUC1A&gt;display 1032
BOFORE1HUC1A&gt;display 1778
BOPFUNHUC1A&gt;display 646
PLSHHU650601&gt;display 94

$1 seria el primer campo osea: PLSHHU650601&gt;display
$2 seria el segundo campo el numero osea: 94

yo quiero que en el primer campo no me salga lo siguiente &gt;display. y no se como hacerlo?

Les agradezco la colaboración.

substr(); con eso lo haria yo

Hola,

tengo un fichero de dos campos separados por ; nombre;email.

Como podría partir ese fichero en varios ficheros que contengan una línea? si por ejemplo tengo 1000 registros, querría que se me creasen 1000 fichero con una línea por fichero nombre;mail.

Gracias

P.D. Gran tutorial y muy claro.

Hola,

tengo un fichero de dos campos separados por ; nombre;email.

Como podría partir ese fichero en varios ficheros que contengan una línea? si por ejemplo tengo 1000 registros, querría que se me creasen 1000 fichero con una línea por fichero nombre;mail.

Gracias

P.D. Gran tutorial y muy claro.

Hola, Tengo el siguiente problema; al hacer consultas en AWK y luego al intentar enviarlas a una hoja de texto se me imprimen por fila, de la siguiente forma
Jose Manuel
Lezama Hernandez
0801 1995
St Augustin

Pedro Antonio
Hernandez Cruz
0801 1992
San Pedro

Y quiero que se me imprima de la siguiente forma

Jose Manuel Lezama Hernadez 0801 1995 St Augustion
Pedro Antonio Hernandez Cruz 0801 1992 San Pedro

Hola, tengo un archivo con 2 campos, uno fecha y el otro texto,, ¿como puedo imprimir solo las filas con fecha mayor a una fecha dada ? ( yyyy-mm-dd)

Envíanos tús preguntas, comentarios o sugerencias

 

Solicita Asistencia

Llámenos al:+54-9-11-32788353

Envíenos un e-mail: consultas@ ---Para enviar el SPAM--- francisconi.org

Skype Status for francisconi.hugo.adrian
 

Suscríbete

Suscríbete y recibe las últimas actualizaciones, noticias y más ...
Zircon - This is a contributing Drupal Theme
Design by WeebPal.