[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Comando awk



El día 27 de septiembre de 2011 03:16, Juan Antonio
<pushakk@limbo.ari.es> escribió:
> El 27/09/11 08:20, fernando sainz escribió:
>> El día 27 de septiembre de 2011 06:59, Pablo Jiménez
>> <pejimene@vtr.net> escribió:
>>> On Mon, Sep 26, 2011 at 10:54:17PM -0500, rantis cares wrote:
>>>> El día 26 de septiembre de 2011 22:45, Pablo Jiménez
>>>> <pejimene@vtr.net> escribió:
>>>>> On Mon, Sep 26, 2011 at 10:02:09PM -0500, rantis cares wrote:
>>>>>> Listeros:
>>>>>>
>>>>>> Buenas noches (dias) a todos.
>>>>>>
>>>>>> Fijense que recurro nuevamente a ustedes para la siguiente consulta.
>>>>>>
>>>>>> tengo un archivo (tirar.txt) que contiene los siguientes datos:
>>>>>>
>>>>>>
>>>>>> dato1 dato2 dato3 dato4
>>>>>> dato1 dato2 dato3 dato4
>>>>>> dato1 dato2 dato3 dato4
>>>>>> dato1 dato2 dato3 dato4
>>>>>> dato1 dato2 dato3 dato4
>>>>>> dato1 dato2 dato3 dato4
>>>>>>
>>>>>> Cada uno de los datos es diferente (llamese nombre, apellidos etc).
>>>>>>
>>>>>> Con el comando awk puedo hacer lo siguiente:
>>>>>>
>>>>>> awk '{print $1}' tirar.txt
>>>>>>
>>>>>> dato1
>>>>>> dato1
>>>>>> dato1
>>>>>> dato1
>>>>>> dato1
>>>>>> dato1
>>>>>>
>>>>>> Y todo bastante bien, pero ahora quiero que la columna de dato1 me sea
>>>>>> mostrado uno por uno y ejecute cierta accion (con otro comando). Para
>>>>>> ello ejecuto la siguiente linea de ordenes
>>>>>>
>>>>>>  if [ -e tirar.txt ]; then
>>>>>>    for i in `cat tirar.txt`;
>>>>>>       do
>>>>>>
>>>>>> # Aqui es donde me encue4ntro con el error, porque para ejecutar awk,
>>>>>> necesito el archivo sobre el que se ejecutara y yo quiero que imprima
>>>>>> el for i in `cat tirar.txt`
>>>>>>            awk awk '{print $1}' $i
>>>>>>
>>>>>>       done
>>>>>>
>>>>>>               else
>>>>>>               echo ""
>>>>>>               echo "No se puede ejecutar la orden"
>>>>>>
>>>>>>  fi
>>>>>>
>>>>>>
>>>>>> Alguna idea?.
>>>>> cat está demás. Basta y sobra con awk.
>>>> ¿Esta demas?. cat lo que hace es mostrar linea por linea, si yo
>>>> ejecuto awk me muestra todos los datos que existen en la columna y yo
>>>> quiero que me muestro todos los datos pero de uno en uno, por eso
>>>> extoy ejecutando cat al archivo tirar.txt
>>>>
>>>> Lo que estoy intentando es hacer un bucle y hasta que encuen tre la
>>>> ultima linea de datos, entonces se detiene y listo.
>>> Envía el mensaje a la lista, no al correo personal.
>>>
>>> Sobre lo que mencionas, awk procesa los datos línea por línea.
>>>
>>> if [ -e tirar.txt ]
>>> then
>>>        awk '
>>>        $1 ~  /REGEX/ { # puede ser ésta u otra condición
>>>                print $1
>>>                system("/orden/a/ejecutar")
>>>        }
>>>        $1 !~ /REGEX/ {
>>>                print "No se puede ejecutar la orden"
>>>        }
>>>        '
>>> fi
>>>
>>> Ahora bien, si sólo quieres imprimir la primera columna en la línea, mejor
>>> te vales de cut:
>>>
>>> FILE=/path/to/file.txt
>>> if [ -e $FILE ]
>>> then
>>>        for line in $(cat $FILE)
>>>        do
>>>                echo $line | cut -d' ' -f 1
>>>        done
>>> else
>>>        echo "No puedo leer archivo/fichero $FILE"
>>> fi
>>>
>>> El único detalle es que el delimitador que usas en los campos de cada línea
>>> en tirar.txt deben ser bien conocidos y regulares (espacio, tabulador, algún
>>> otro caracter...).
>>>
>>> Si aún deseas matar moscas con un fusil (ie. usar awk), puedes reemplazar
>>> cut en el script anterior.
>>>
>>> FILE=/path/to/file.txt
>>> if [ -e $FILE ]
>>> then
>>>        for line in $(cat $FILE)
>>>        do
>>>                echo $line | awk '{ print $1 }'
>>>                done
>>> else
>>>        echo "No puedo leer archivo/fichero $FILE"
>>> fi
>>>
>>> Saludos.
>>>
>>> --
>>> Pablo Jiménez
>>>
>>>
>>> --
>>> To UNSUBSCRIBE, email to debian-user-spanish-REQUEST@lists.debian.org
>>> with a subject of "unsubscribe". Trouble? Contact
>>> listmaster@lists.debian.org
>>> Archive: [🔎] 20110927045900.GA15151@example.net">http://lists.debian.org/[🔎] 20110927045900.GA15151@example.net
>>>
>>>
>> Y no vale un simple for:
>>
>> for a in $(awk '{print $1}' tirar.txt) .....
>>
>>
>> S2
>>
>>
>
> O un simple xargs.
>
> [[ -e file.txt ]] && awk '{print $1}' file.txt | xargs orden_a_ejecutar
>
> Un saludo.

A veces las presentaciones y las despedidas son mas largas que las respuestas.

Mas sorprendido por la sencillez.

Gracias

>
> --
> "Tanto en los deportes como en todo lo demás, soy un experto. Pero para mantener viva mi inteligencia natural y fuera de serie, tengo que comer mucho"
>
>
> --
> To UNSUBSCRIBE, email to debian-user-spanish-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> Archive: [🔎] 4E81865C.8040506@limbo.ari.es">http://lists.debian.org/[🔎] 4E81865C.8040506@limbo.ari.es
>
>



-- 
"Al juntarme dia tras dia con los Listeros, mi capacidad intelectual
crece en proporcion inversa a la ignorancia generada. Gracias
Linuxeros"


Reply to: