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
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 awk
como 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 FS
en un BEGIN
bloque.
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 awk
guión, pero lo ha colocado en un guión. Este es tu awk
guión:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Guárdelo en un archivo script.awk
y ejecútelo como
awk -F',' -f script.awk inputfile
Ahora algunos consejos sobre tu guión:
awk
Los comandos se ven así CONDITION {COMMAND(S)}
. Si CONDITION
se 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 CONDITION
se cumple.
En tu caso:
/./
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ónSe utiliza
" "
como separador entre las variables, se utiliza,
para aplicar el valor predeterminado.Deberá proporcionar el uso
,
como separador en el script en unBEGIN
bloque 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:
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
.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.