verwirrt über Awk-Scripting

verwirrt über Awk-Scripting

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.

Aufgabe 1

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 FSin einem BEGINBlock 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 awkSkript geschrieben, es aber in ein Skript eingefügt. Dies ist Ihr awkSkript:

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

Speichern Sie es in einer Datei script.awkund führen Sie es wie folgt aus:

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

Nun noch ein paar Hinweise zu Deinem Skript:

awkBefehle sehen so aus CONDITION {COMMAND(S)}. Wenn CONDITIONfü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 CONDITIONerfüllt ist.

In Ihrem Fall:

  1. /./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 Bedingung

  2. Verwenden Sie " "als Trennzeichen zwischen den Variablen, verwenden Sie ,um den Standardwert anzuwenden

  3. Sie müssen „using“ ,als Trennzeichen im Skript in einem anfänglichen BEGIN-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:

  1. 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.

  2. 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.

verwandte Informationen