awk ne se termine pas


8

J'ai le code suivant dans un fichier nommé awktest1.awk:

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

employee.txtcontient les données suivantes:

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

J'exécute la awkcommande en tant que:

awk -f awktest1.awk

mais il imprime juste startet ne se termine pas. Quelqu'un peut-il m'aider avec ce que je fais mal ici?


2
Notez qu'en écrivant: print $2, "\t", $5contrairement à print $2 "\t" $5, vous écrivez le 2ème champ suivi par OFS (espace), TAB, OFS et le 5ème champ.
Stéphane Chazelas

Réponses:


12

L'erreur donne le nom de fichier à traiter dans le script; vous devez supprimer employee.txtdu script et l'exécuter comme suit

awk -f awktest1.awk employee.txt

ou même, si le script est exécutable,

./awktest1.awk employee.txt

Le script devient

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

En l'état, awkattend l'entrée de l'entrée standard au lieu de la lecture d'un fichier. Voilà pourquoi ça ne finit jamais ...


12

Pour compléter la réponse de @ Stephen , si vous vouliez coder en dur le nom du fichier d'entrée dans le awkscript, vous écririez:

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

Pour plusieurs fichiers:

#!/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"}

5

Ou si vous ne voulez pas passer le nom employee.txtde fichier comme argument de ligne de commande, vous pouvez faire quelque chose comme ceci:

Code:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.