PDA

Ver la versión completa : Venga, va, "pa" que os entretengais. Ejercicio de AWK



akualung
01/07/2010, 00:57
Hola, comunidad. Me tomo una pequeña licencia para enseñaros un ejercicio que nos han puesto en una prueba de un curso de linux que estoy haciendo. Es el ultimo de una tanda de siete. El enunciado es este:


Tu jefe es supersticioso y quiere que elimines de la lista de presidentes (n. del a.: más abajo explico a qué se refiere con esto) los que pueden traer mala suerte.

Genera un archivo "presidentes_filtrado.txt" que NO contenga:

- Presidentes que empezaron su mandato en un año múltiplo de 7.

- Presidentes que terminaron su mandato en un año múltiplo de 13.

- Presidentes que no tengan ninguna letra 'a' ni 'r' en su nombre y apellidos (obviamente, tanto mayúsculas como minúsculas).

El archivo a tratar es uno en texto plano con el nombre completo de cada presidente, su año de inicio y su año de fin, un presidente en cada linea y con cada campo separado por comas. La lista de presidentes es esta:

George Washington,1789,1797
John Adams,1797,1801
Thomas Jefferson,1801,1809
James Madison,1809,1817
James Monroe,1817,1825
John Quincy Adams,1825,1829
Andrew Jackson,1829,1837
Martin Van Buren,1837,1841
William Henry Harrison,1841,1841
John Tyler,1841,1845
James Polk,1845,1849
Zachary Taylor,1849,1850
Millard Fillmore,1850,1853
Franklin Pierce,1853,1857
James Buchanan,1857,1861
Abraham Lincoln,1861,1865
Andrew Johnson,1865,1869
Ulysses S. Grant,1869,1877
Rutherford B. Hayes,1877,1881
James A. Garfield,1881,1881
Chester A. Arthur,1881,1885
Grover Cleveland,1885,1889
Benjamin Harrison,1889,1893
Grover Cleveland,1893,1897
William McKinley,1897,1901
Theodore Roosevelt,1901,1909
William H. Taft,1909,1913
Woodrow Wilson,1913,1921
Warren Harding,1921,1923
Calvin Coolidge,1923,1929
Herbert Hoover,1929,1933
Franklin D. Roosevelt,1933,1945
Harry S Truman,1945,1953
Dwight D. Eisenhower,1953,1961
John F. Kennedy,1961,1963
Lyndon B. Johnson,1963,1969
Richard M. Nixon,1969,1974
Gerald R. Ford,1974,1977
Jimmy Carter,1977,1981
Ronald W. Reagan,1981,1989
George Bush,1989,1993
William J. Clinton,1993,2001
George W. Bush,2001,2005
George W. Bush,2005,2009
Barack Obama,2009,2010


Y en el siguiente spoiler está la solución que propuse yo, por si alguien me puede decir si está bien o no, porque según el profesor el resultado no es correcto. Me sale solo un registro (Lyndon B. Johnson) y en teoria han de salir varios más. Yo me he mirado el mio por activa y por pasiva y pondría la mano en el fuego a que está correcto. De hecho lo voy a rehacer ahora con javascript a ver si me sigue saliendo lo mismo.



awk -F',' '{if (index(tolower($1),"a") == 0 && index(tolower($1),"r") == 0 && ($2 % 7)!=0 && ($3 % 13)!=0) print $0 }' presidentes.txt > presidentes_filtrado.txt



Venga, que lo disfruten con salú :D

Locke
01/07/2010, 01:11
Voy a pensarmelo mejor, que no lo lei bien xD

Creo que ya lo tengo. Si la funcion index devuelve 0 si no encuentra la segunda cadena dentro de la primera (que no lo se), deberia ser asi:

awk -F',' '{if ( !(index(tolower($1),"a") == 0 && index(tolower($1),"r") == 0) && ($2 % 7)!=0 && ($3 % 13)!=0) print $0 }' presidentes.txt > presidentes_filtrado.txt

akualung
01/07/2010, 01:20
Yo no se mu bien lo que es el awk ese, pero no tendrias que cambiar los AND por OR excepto el que une la comprobacion de la letra 'a' y la 'r'?

Eso pensaba yo, pero es que, claro, nos pide que excluyamos los que el año de inicio son múltiplos de 7 y el año de fin son multiplos de 13.

Si el ejercicio solo fuera lo de los años, el resultado tendría que ser, en pseudocódigo, algo asi como esto:

si ( campo2 mod 7 es cero o campo3 mod 13 es cero)


Pero yo, para no liarme tanto, invertí el enunciado para que quedase más claro (al menos para mí), y me quedó "inclúyeme los que tengan un año de inicio que NO sea multiplo de 7, y los que tengan un año de fin que No sea multiplo de 13".

Entonces hay que negar el pseudocódigo que he hecho antes y, si no ando errado, la negación de un OR es un AND. Me quedaría así:

si ( campo2 mod 7 difiere de cero y campo3 mod 13 difiere de cero)


No se, yo lo entendí así.

Ah, por cierto, en el tercer punto del enunciado creo que hubo un fallo, me parece que se trata de eliminar los que tengan una 'a' y una 'r' en el nombre. Lo digo porque cuando se corrigió el ejercicio, un compañero presentó su idea y, la parte de las letras la resolvió sin awk (no era obligatorio hacerlo todo en awk pero se podia hacer), o sea con un egrep, y lo que hizo fué "egrep -v [ar] presidentes.txt (luego el resultado ya lo pasó con un pipe al script de awk). El caso es que le dieron esa parte por buena, así que yo entiendo que el enunciado no era correcto y el profe se debió liar con la doble negación que parece haber implícita en el ultimo punto (que NO contengan nombres que NO tengan una 'a' ni una 'r').

PharaOnyx
01/07/2010, 01:27
El problema es que te dice que no tenga ni 'a' ni 'r' en el apellido, pero tú has puesto que no tenga ni 'a' ni 'r' en el nombre completo. Has separado la línea por el carácter ',', lo cual te deja en $1 el nombre completo, no el apellido

Saludos, Alex

akualung
01/07/2010, 01:47
El problema es que te dice que no tenga ni 'a' ni 'r' en el apellido, pero tú has puesto que no tenga ni 'a' ni 'r' en el nombre completo. Has separado la línea por el carácter ',', lo cual te deja en $1 el nombre completo, no el apellido

Saludos, Alex

Ostras, acabo de repasar lo que me has dicho y resulta que me he confundido al traducir el enunciado (el original estaba en catalán). Se refería al nombre completo, no solo a su apellido. Con la hora que es, debí leer "cognom" en vez de "nom" y me he apollardao. Ahora lo arreglo en el post principal. Perdón por la metedura de pata :P

*ok, ya está arreglado.

Locke
01/07/2010, 01:50
Eso pensaba yo, pero es que, claro, nos pide que excluyamos los que el año de inicio son múltiplos de 7 y el año de fin son multiplos de 13.

Si el ejercicio solo fuera lo de los años, el resultado tendría que ser, en pseudocódigo, algo asi como esto:

si ( campo2 mod 7 es cero o campo3 mod 13 es cero)


Pero yo, para no liarme tanto, invertí el enunciado para que quedase más claro (al menos para mí), y me quedó "inclúyeme los que tengan un año de inicio que NO sea multiplo de 7, y los que tengan un año de fin que No sea multiplo de 13".

Entonces hay que negar el pseudocódigo que he hecho antes y, si no ando errado, la negación de un OR es un AND. Me quedaría así:

si ( campo2 mod 7 difiere de cero y campo3 mod 13 difiere de cero)


No se, yo lo entendí así.

Ah, por cierto, en el tercer punto del enunciado creo que hubo un fallo, me parece que se trata de eliminar los que tengan una 'a' y una 'r' en el nombre. Lo digo porque cuando se corrigió el ejercicio, un compañero presentó su idea y, la parte de las letras la resolvió sin awk (no era obligatorio hacerlo todo en awk pero se podia hacer), o sea con un egrep, y lo que hizo fué "egrep -v [ar] presidentes.txt (luego el resultado ya lo pasó con un pipe al script de awk). El caso es que le dieron esa parte por buena, así que yo entiendo que el enunciado no era correcto y el profe se debió liar con la doble negación que parece haber implícita en el ultimo punto (que NO contengan nombres que NO tengan una 'a' o una 'r').

Prueba lo que te puse arriba, que lo corregi. Tu has puesto que imprima los que no hayan empezado en año multiplo de 7, que no hayan terminado en multiplo de 13 pero ademas que NO tengan ni A ni R en el nombre... y esos hay que eliminarlos. Por eso solo te esta dejando el que no tiene ni la A ni la R, tienes que negar esas dos expresiones en conjunto.

Luego si lo que dice pharaonix es cierto... pues ya te tendrias que apañar para separar el apellido, pero como hay algunos que tienen segundo nombre y tal, y a tu compañero le dio bueno lo del grep... creo que se refiere realmente a que no lo contengan en el nombre completo.

Aiken
01/07/2010, 03:08
Ostras, acabo de repasar lo que me has dicho y resulta que me he confundido al traducir el enunciado (el original estaba en catalán). Se refería al nombre completo, no solo a su apellido. Con la hora que es, debí leer "cognom" en vez de "nom" y me he apollardao. Ahora lo arreglo en el post principal. Perdón por la metedura de pata :P*ok, ya está arreglado.

tramposillo :D seguro que eso fue lo mismo que le dijise al profe cuando te dijo que estaba mal :D

Aiken

Pokeviktor
01/07/2010, 03:12
http://bulk2.destructoid.com/ul/121181-wtf_picard-468x.jpg

akualung
01/07/2010, 08:47
http://bulk2.destructoid.com/ul/121181-wtf_picard-468x.jpg

Pues ni yo mismo lo se ya :S

Hola. Ahora mismo estoy a punto de salir para el curso éste. Acabo de leer lo que habeis puesto desde donde lo dejé ayer, pero hasta la noche no podré responder, lo siento. Gracias de momento a todos los que habeis escrito.