awk endet nicht

8

Ich habe den folgenden Code in einer Datei mit dem Namen awktest1.awk:

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"} employee.txt

wo employee.txtenthält die folgenden Daten:

100  Thomas  Manager    Sales  $5,000 
200  Jason   Developer  Technology  $5,500 
300  Sanjay  Sysadmin   Technology  $7,000 
400  Nisha   Manager    Marketing   $9,500 
500  Randy   DBA        Technology  $6,000

Ich führe den awkBefehl wie folgt aus:

awk -f awktest1.awk

aber es druckt nur startund endet nicht. Kann mir jemand helfen, was ich hier falsch mache?

Saket Agarwal
quelle
2
Beachten Sie, dass Sie beim Schreiben Folgendes schreiben: Im print $2, "\t", $5Gegensatz zu print $2 "\t" $5schreiben Sie das 2. Feld, gefolgt von OFS (Leerzeichen), TAB, OFS und dem 5. Feld.
Stéphane Chazelas

Antworten:

12

Der Fehler gibt den Dateinamen an, der im Skript verarbeitet werden soll. Sie sollten es employee.txtaus dem Skript entfernen und wie folgt ausführen

awk -f awktest1.awk employee.txt

oder sogar, wenn das Skript ausführbar ist,

./awktest1.awk employee.txt

Das Skript wird

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"}

Wie es ist, awkwird von der Standardeingabe für die Eingabe warten , von einer Datei anstatt zu lesen. Deshalb endet es nie ...

Stephen Kitt
quelle
11

Um die Antwort von @ Stephen zu ergänzen awk, würden Sie schreiben , wenn Sie den Namen der Eingabedatei im Skript fest codieren möchten:

#!/bin/awk -f
BEGIN{
  ARGC=2
  ARGV[1] = "employee.txt"
  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}

Für mehrere Dateien:

#!/bin/awk -f
BEGIN{
  ARGC=1
  ARGV[ARGC++] = "employee1.txt"
  ARGV[ARGC++] = "employee2.txt"
  ARGV[ARGC++] = "employee3.txt"
  # ...

  # or ARGC=1+split("employee1.txt employee2.txt employee3.txt", ARGV)

  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}
Stéphane Chazelas
quelle
5

Wenn Sie den Dateinamen nicht employee.txtals Befehlszeilenargument übergeben möchten , können Sie Folgendes tun:

Code:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 
Neuron
quelle