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

Re: Comando awk



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


Reply to: