Problemas con gawk al tratar el primer registro de un fichero

Imagen de juantu
0 puntos

Hola a todos,

Quería saber cómo solucionar el problema que tiene gawk al tratar el primer registro de un fichero en casos como este:

poncho@ubuntu:~/Documents/prob_comandos$ cat fich_prueba.txt
HOLA|AMIGOS|QUE|TAL
ADIOS|HEY|COMO|ESTAIS
COCHE|PUERTA|MATRICULA|RUEDA
HEY|HOLA|JUAN|PEDRO

poncho@ubuntu:~/Documents/prob_comandos$ gawk '{FS="|"; print (NF)}' fich_prueba.txt
1
4
4
4

Como veis, todos los registros del fichero tienen 4 campos separados por "|". Sin embargo, para el primer registro, gawk me devuelve que tiene sólo 1 campo. ¿Por qué ocurre esto y cómo se puede solucionar?

Muchas gracias y saludos

Imagen de JAVIER NAVARRO ALTIMIRA
+1
+1
-1

cat a.txt | awk --field-separator="|" '
{
printf("%s\n", $1);
printf("%d\n", NF);
}
'

+1
+1
-1
Imagen de rioport
+1
+1
-1

... ser:

gawk --field-separator="|" "{ print NF }" fich_prueba.txt
+1
+1
-1

-- GC --

Imagen de juantu
+1
0
-1

Los dos funcionan correctamente, gracias! Aunque es curioso, porque yo había utilizado el comando que os indiqué en mi mensaje inicial en otra distribución de Linux (no recuerdo cuál) y me funcionaba bien. Un saludo!

+1
0
-1
Imagen de rioport
+1
+1
-1

...
According to the POSIX standard, awk is supposed to behave as if each record is split into fields at the time that it is read. In particular, this means that you can change the value of FS after a record is read, but before any of the fields are referenced. The value of the fields (i.e. how they were split) should reflect the old value of FS, not the new one.

However, many implementations of awk do not do this. Instead, they defer splitting the fields until a field reference actually happens, using the current value of FS! This behavior can be difficult to diagnose. The following example illustrates the results of the two methods. (The sed command prints just the first line of `/etc/passwd'.)

sed 1q /etc/passwd | awk '{ FS = ":" ; print $1 }'

will usually print

root

on an incorrect implementation of awk, while gawk will print something like

root:nSijPlPhZZwgE:0:0:Root:/:

...

Fuente

+1
+1
-1

-- GC --