confundido acerca de las secuencias de comandos awk

confundido acerca de las secuencias de comandos awk

Las instrucciones indican que su archivo de script se probará en nuestro sistema con el siguiente comando:

awk -f ./awk4.awk input.csv

Escriba un script awk que acepte el siguiente archivo y genere los campos de nombre y calificación

tarea 1

aparentemente, creé un script bash y debe ser un script awk que se ejecute con awk -f desde la línea de comando. A continuación está mi código. ¿Existe una manera fácil de convertir mis scripts bash en scripts awk sin tener que rehacer todo? Realmente confundido acerca de las instrucciones.

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' $1

Respuesta1

En un script awk, el contenido es lo que usted proporcionaría awkcomo comandos. Entonces en este caso, eso es:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

Sin embargo, esto hará que sea complicado de usar -F ,, por lo que debes configurarlo FSen un BEGINbloque.

Entonces tu guión sería:

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

Respuesta2

Ha escrito un awkguión, pero lo ha colocado en un guión. Este es tu awkguión:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}

Guárdelo en un archivo script.awky ejecútelo como

awk -F',' -f script.awk inputfile

Ahora algunos consejos sobre tu guión:

awkLos comandos se ven así CONDITION {COMMAND(S)}. Si CONDITIONse cumple para una línea (registro), {COMMAND(S)}se ejecuta. Si no hay CONDITION, {COMMAND(S)}se ejecuta para todos los registros; si no hay, {COMMAND(S)}el registro simplemente se imprime cada vez que CONDITIONse cumple.

En tu caso:

  1. /./es una expresión regular que coincide con líneas con cualquier carácter... por lo que todas menos las líneas vacías, es bastante redundante, como condición

  2. Se utiliza " "como separador entre las variables, se utiliza ,para aplicar el valor predeterminado.

  3. Deberá proporcionar el uso ,como separador en el script en un BEGINbloque inicial.


BEGIN {FS=","}
{print $1,$2}

Si también desea utilizar una coma como separador de salida, utilice:

BEGIN {FS=OFS=","}
{print $1,$2}

Respuesta3

Un script awk es solo una colección de comandos awk que pueden ejecutarse mediante awk. Hay dos formas de escribir un script awk:

  1. Simplemente escriba los comandos awk en un archivo de texto y llame con awk -f /path/to/file.awk. En tu caso sería:

    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    Y lo ejecutarías como:

    awk -F, -f /path/to/file.awk inputFile
    

    O, si necesita que se ejecute solo con awk -f ./path/to/file.awk inputFile, sin -F,entonces configure el separador de campo en el script mismo:

    BEGIN{ FS=","}
     /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    Y luego corre con awk -f /path/to/file.awk inputFile.

  2. Escriba los comandos pero use el shebang para especificar qué intérprete debe leer el guión. En tu caso, se vería así:

    #!/usr/bin/awk -f
    
    ## With this approach, you can't use -F so you need to set
    ## the field separator in a BEGIN{} block.
    BEGIN{ FS=","}
    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    Y luego haría que el script fuera ejecutable ( chmod a+x /path/to/file.awk) y lo ejecutaría así:

    /path/to/file.awk inputFile
    
    

Ambos son guiones extraños. La tercera opción es escribir uncaparazónscript en su lugar y haga que el script de shell ejecute awk. Se vería así:

#!/bin/sh

awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' "$1"

Lo que tenías no era ni una cosa ni la otra: estabas usando un shebang awk pero tenías un script de shell en lugar de un script awk.

información relacionada