Explique el script Awk que se proporciona a continuación.

Explique el script Awk que se proporciona a continuación.

¿Alguien puede explicarme paso a paso debajo del script AWK escrito?

Tengo el siguiente código escrito en mi script para formatear los datos del archivo plano. Solo quería entenderlo para poder reutilizarlo. No soy un experto en Unix, pero me han asignado una tarea. ¡Ayuda!

awk -vsep=$SEPARATOR 'NR>2{if(NF){if(!s){gsub(" *"sep"[ \t]*",sep);printf "%d%s\n",NR-2,$0}}else s=1}' file_name > new_file

 # where $SEPARATOR = ';'

Gracias de antemano.

Respuesta1

La opción de línea de comando -vsep=$SEPERATORestablece una variable awk sep(que se usa en la búsqueda/reemplazo) a lo que usted especifique. ;en tu caso.

# NR = Number of current Record, or line number
# Skip the first line
if ( NR > 2 ) {

  # NF = Number of fields in the current record
  # If the line contains something other than a blank line or the 
  # awk field separator characters (whitespace by default)
  if ( NF ) {

    # If we have not seen a blank line (script flag s)
    if ( !s ) {

      # Search the current line repeatedly (gsub) for any number of spaces (" *") 
      # before a ";" then any number of spaces or tabs ([ \t]*) after the `;`
      # and replace it all with just a ";"
      gsub( " *"sep"[ \t]*", sep );

      # Print the line number, 0 based (NR-2) as a signed decimal integer (`%d`)
      # then the complete line ($0) followed by a new line character (\n)
      printf "%d%s\n", NR-2, $0;
    }

  } else { 

    # Set the "seen a blank line" flag
    s = 1
  }

}

file_name > new_fileescribe la salida en un nuevo archivo llamadonew_file

Por cierto, si estructura el script de la siguiente manera, será mucho más fácil de leer y será más rápido si tiene grandes cantidades de datos después de una línea en blanco.

awk -vsep=$SEPERATOR '{

# Skip the first line
if (NR == 1) { next; }

# Stop processing if we see a blank line
if (NF == 0) { exit; }

# Remove spaces before and spaces/tabs after separator
gsub( " *"sep"[ \t]*", sep );

# Print the line with a record number starting from 0
printf "%d%s\n", NR-2, $0;

}' file_name > new_file

información relacionada