2011-02-10 14 views
5

Por qué este script awk:Awk separador de campo comportamiento

awk '{FS = "\t" ; print $1 " - " $2}' A.txt 

con este archivo de entrada A.txt

B A A1 
C B A2 
D A A3 

da salida a estos resultados

B - A 
C B - A2 
D A - A3 

Tenga en cuenta que entre la primera B y A hay un espacio y no un carácter de tabulación. Comprobé esto doble

+1

Compare con la salida de 'awk -F" \ t "'{print $ 1" - "$ 2}' A.txt' - el patrón en las tres líneas es idéntico. Entonces su 'FS' tiene influencia en la primera línea de A.txt solamente. – eumiro

Respuesta

7

Creo que es porque FS se está configurando en la primera acción. Antes de que se invoque la primera acción, la división de la primera línea ya está hecha, y usa el FS por defecto (espacio en blanco). Para obtener coherencia, debe invocar awk con la opción -F.

0

si no coloca un espacio entre ellas, awk simplemente concatena la cuerda.

cambio de la orden de

print $1, " - ", $2 

También es probable que desee establecer OFS para la salida

+0

No ayudó, lo mismo –

7

La forma correcta es:

BEGIN {FS = "\t"} 
{ print $1 " - " $2} 

se está ajustando el FS demasiado tarde (después de la la primera línea está dividida)

2

En primer lugar, está cambiando la variable FS cada línea; probablemente solo tengas la intención de cambiarlo una vez. Además, si desea cambiar FS, probablemente desee cambiarlo antes de analizar las líneas. POSIX requiere que cualquier cambio en FS solo afecte el análisis de la siguiente línea . (Muchas implementaciones todavía no se ajustan a ese requisito, y pueden usar el valor cambiado de FS para la línea actual si la línea actual aún no se ha analizado). Para resolver estos dos problemas, debe cambiar FS así:

awk 'BEGIN { FS="\t" } {...}' A.txt 

o esto:

awk -v 'FS=\t' '{...}' A.txt 

(. también hay un formulario utilizando -F '\t' en lugar de -v 'FS=\t', pero algunas implementaciones de awk no cumplirá con la C-Escape \t en la antigua construcción)

B Obsérvese que FS gobierna el análisis sintáctico de los datos de entrada, mientras que el OFS rige el análisis sintáctico de los datos de salida. No está claro de tu pregunta lo que quieres hacer. Al principio, sus datos de entrada no se ven como si tuvieran pestañas, por lo que probablemente desee dejar el FS en su valor predeterminado de "".

Si desea cambiar el formato de salida , puede configurar OFS en "\ t", en cualquiera de las formas que acabamos de describir para FS. No está claro si eso es lo que quieres, ya sea porque no estás haciendo uso de OFS en tu script de prueba. Cuando uno dice:

print $1 " - " $2 

imprime un solo argumento, que es la concatenación de $ 1, y "-" y $ 2.Para hacer uso de la OFS, que tendría que imprimir varios argumentos, que serían separados por una coma --- por ejemplo así:

print $1, $2 

Desconcertado, me mira de nuevo a los datos de la muestra y que la producción actual . Tal vez sus datos de la muestra realmente tiene el formato: B<space>A<tab>A1, y tal vez lo hacen la intención de ser el establecimiento de FS con el fin de ser el acaparamiento de la B<space>A en $ 1, y la A1 $ 2. Si es así, simplemente asegúrese de configurar FS en el momento correcto, antes de que comience cualquier procesamiento de línea. Entonces su script debería funcionar sin importar qué implementación de awk use.

Cuestiones relacionadas