In den Anweisungen heißt es, dass Ihre Skriptdatei mit dem folgenden Befehl auf unserem System getestet wird:
awk -f ./awk4.awk input.csv
Schreiben Sie ein Awk-Skript, das die folgende Datei akzeptiert und die Felder „Name“ und „Note“ ausgibt.
anscheinend habe ich ein Bash-Skript erstellt und es muss ein Awk-Skript sein, das mit awk -f von der Befehlszeile aus ausgeführt wird. Unten ist mein Code. Gibt es eine einfache Möglichkeit, meine Bash-Skripte in Awk-Skripte umzuwandeln, ohne alles neu machen zu müssen? Bin wirklich verwirrt über die Anweisungen.
#!/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
Antwort1
In einem awk-Skript ist der Inhalt das, was Sie als Befehle bereitstellen würden awk
. In diesem Fall ist das also:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Dies erschwert jedoch die Verwendung, -F ,
also legen Sie es stattdessen FS
in einem BEGIN
Block fest.
Ihr Skript würde also lauten:
#!/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
}
Antwort2
Sie haben ein awk
Skript geschrieben, es aber in ein Skript eingefügt. Dies ist Ihr awk
Skript:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Speichern Sie es in einer Datei script.awk
und führen Sie es wie folgt aus:
awk -F',' -f script.awk inputfile
Nun noch ein paar Hinweise zu Deinem Skript:
awk
Befehle sehen so aus CONDITION {COMMAND(S)}
. Wenn CONDITION
für eine Zeile (Datensatz) erfüllt ist, {COMMAND(S)}
wird/werden sie ausgeführt. Wenn nicht vorhanden CONDITION
, {COMMAND(S)}
wird/werden sie für alle Datensätze ausgeführt, wenn nicht vorhanden, {COMMAND(S)}
wird der Datensatz einfach gedruckt, wenn CONDITION
erfüllt ist.
In Ihrem Fall:
/./
ist ein regulärer Ausdruck, der mit Zeilen mit beliebigen Zeichen übereinstimmt ... also mit allen Zeilen außer leeren Zeilen - es ist ziemlich redundant, als BedingungVerwenden Sie
" "
als Trennzeichen zwischen den Variablen, verwenden Sie,
um den Standardwert anzuwendenSie müssen „using“
,
als Trennzeichen im Skript in einem anfänglichenBEGIN
-Block angeben.
BEGIN {FS=","}
{print $1,$2}
Wenn Sie Kommas auch als Ausgabetrennzeichen verwenden möchten, verwenden Sie:
BEGIN {FS=OFS=","}
{print $1,$2}
Antwort3
Ein awk-Skript ist einfach eine Sammlung von awk-Befehlen, die ausgeführt werden können awk
. Es gibt zwei Möglichkeiten, ein awk-Skript zu schreiben:
Schreibe einfach die awk-Befehle in eine Textdatei und rufe sie mit auf
awk -f /path/to/file.awk
. In deinem Fall wäre das:/./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
Und Sie würden es wie folgt ausführen:
awk -F, -f /path/to/file.awk inputFile
Oder, wenn es nur mit ausgeführt werden soll
awk -f ./path/to/file.awk inputFile
, ohne,-F,
dann legen Sie den Feldtrenner im Skript selbst fest:BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
Und dann mit ausführen
awk -f /path/to/file.awk inputFile
.Schreiben Sie die Befehle, aber verwenden Sie den Shebang, um anzugeben, welcher Interpreter das Skript lesen soll. In Ihrem Fall würde das so aussehen:
#!/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 }
Und Sie würden das Skript dann ausführbar machen (
chmod a+x /path/to/file.awk
) und es wie folgt ausführen:/path/to/file.awk inputFile
Das sind beides awk-Skripte. Die dritte Möglichkeit ist, einHülseSkript und lassen Sie das Shellskript das awk ausführen. Das würde so aussehen:
#!/bin/sh
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' "$1"
Was Sie hatten, war weder das eine noch das andere: Sie verwendeten ein Awk-Shebang, hatten aber ein Shell-Skript anstelle eines Awk-Skripts.