Split dentro de awk

Resulta que quiero a partir de una línea quiero obtener esta dividida en diferentes partes.
Se que esto se hace awk '{ split ( $0,a,patron ); print a[1]}'
Cuando el patrón es único carácter, sale correctamente, pero si el patrón esta formado por 2 o más caracteres solo tiene en cuenta el primero.
¿Sabrías decirme como puedo hacer para que pudiera utilizar el patrón con más de 1 carácter?
1

1 Respuesta

23.275 pts.
Entre que he tenido tres semanas de locos por trabajo, no he entrado al internet y cuando entraba tenia varias preguntas que he dejado dos (una es esta) preguntas que se me rezagaran, un millón de disculpas. Si me calificas mal, no cabe duda que ahora si me lo merezco.
Bueno, como efectivamente dices, para separar una linea en campos y meternos a un array se utiliza split. Me dices que no te funciona adecuadamente con un patrón de más de un carácter.
awk ´{ split($0, a, ":="); print a[1]}´ me lo hizo adecuadamente, ¿encierras entre comillas el patron?, puedes checarlos con FS que regresa el numero de campos obtenidos.
Los patrones se pueden separar con comillas, corchetes (rangos, p.e. [0-9] es un numero del 0 al 9), x* (0 o más x's), ¿x+ (una o más x's) o x? (Cero o una x)
Bueno, tal sea la version de Unix que tienes (ya trabajo sobre Unix System V), entonces puedes proar con lo siguiente:
awk -F":=" ´{print $1}´ entrada
Donde -F es la opción para determinar el separador de campo y entrada es el texto a revisar.
Si nada de esto te funciona, solo te queda revisar caractre por carácter la linea:
Awk ´
BEGIN
separadores = "[+-]?[0-9]"
for (i=1; i<=NR; i++) {
n = split(renglon, d );
inicial=1;
for (j=1; j<=n; j++) {
if (d[j] ~ separadores) {
printf("s" substr(renglon,inicial,j-inicial));
inicial = j;
}
}
}
END {print FS}´ ArchivoTexto
Este programa revisa todo un archivo no solo una linea, tal vez te pueda dar una idea de como hacerle.
Puede que sea el S.O, pero he realizado varias pruebas y no me funciona. Yo utilizo solaris 5.6
Esta es una de ellas y no me saca nada
#!/bin/sh
cat kk | awk -F"do" '{print a[1]; print a[2]; print a[3]}'
La otra solo me separa por la d, no por do
#!/bin/sh
cat kk | awk '{split ($0,a,"do"); print a[1]; print a[2]; print a[3]}'
Gracias de todas formas
Un saludo
La linea que dices que no saca nada es por que el array a no tiene nada. Deberías probar con:
cat kk | awk -F"do" '{print $1; print $2; print $3}'
Ahora, referente a la función split, pues la acabo de probar también en Linux distribuciones Mandrake 7 y RedHot 6 y funciona normal
ls -l | awk `{split($0,a,"an"); print a[1]; print a[2]; print a[3];}`
La hace perfectamente. También prove en Linux awk -F y todo es ak.
Solo puedo hacerte un par de consejos como ultima instancia para que te funcione.
Primero, se que es obio, pero un Unix system V, awk necesita el apostrofe invertido, no el normal ( ' <- Este no. ` <- Este si), aunque por ejemplo en Linux es indistinto cualquiera que uses. Pero checalo, tal vez nos sorprendamos.
Segundo. Revisa la sintaxis del awk en tu ayuda ($man awk). Tal vez veas algo que solucione el problema.
Tercero. Prueba con la version más nueva de awk, gawk. Esta version soporta muchas nuevas funciones, puedes checarla la ayuda en el man de tu sistema.
Revisa, si tienes gawk si te soporta la opción -TRADITIONAL, con ella awk se comportara como si corriera en Unix System V.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas