User Tag List

Resultados 1 al 9 de 9

Tema: Venga, va, "pa" que os entretengais. Ejercicio de AWK

  1. #1

    Fecha de ingreso
    Jun 2006
    Mensajes
    4,574
    Mencionado
    41 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,259
    Agradecer Thanks Received 
    700
    Thanked in
    Agradecido 427 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    6

    Venga, va, "pa" que os entretengais. Ejercicio de AWK

    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.

    Spoiler: Ver


    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ú
    Última edición por akualung; 01/07/2010 a las 01:48

  2. #2

    Fecha de ingreso
    Mar 2004
    Mensajes
    9,786
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    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
    Última edición por Locke; 01/07/2010 a las 01:36
    "This post reminds me of a puzzle..."

  3. #3

    Fecha de ingreso
    Jun 2006
    Mensajes
    4,574
    Mencionado
    41 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,259
    Agradecer Thanks Received 
    700
    Thanked in
    Agradecido 427 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    6
    Cita Iniciado por Locke Ver mensaje
    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').
    Última edición por akualung; 01/07/2010 a las 01:49

  4. #4

    Fecha de ingreso
    Mar 2005
    Mensajes
    3,145
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    29
    Thanked in
    Agradecido 19 veces en [ARG:2 UNDEFINED] posts
    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

  5. #5

    Fecha de ingreso
    Jun 2006
    Mensajes
    4,574
    Mencionado
    41 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,259
    Agradecer Thanks Received 
    700
    Thanked in
    Agradecido 427 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    6
    Cita Iniciado por PharaOnyx Ver mensaje
    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.

  6. #6

    Fecha de ingreso
    Mar 2004
    Mensajes
    9,786
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por akualung Ver mensaje
    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.
    "This post reminds me of a puzzle..."

  7. #7

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    Cita Iniciado por akualung Ver mensaje
    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 seguro que eso fue lo mismo que le dijise al profe cuando te dijo que estaba mal

    Aiken


  8. #9

    Fecha de ingreso
    Jun 2006
    Mensajes
    4,574
    Mencionado
    41 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,259
    Agradecer Thanks Received 
    700
    Thanked in
    Agradecido 427 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    6
    Cita Iniciado por Pokeviktor Ver mensaje
    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.

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •