awk non finisce


8

Ho il seguente codice in un file chiamato awktest1.awk:

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

dove employee.txtcontiene i seguenti dati:

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

Eseguo il awkcomando come:

awk -f awktest1.awk

ma stampa starte non finisce. Qualcuno può darmi una mano con cosa sto facendo di sbagliato qui?


2
Nota che scrivendo: print $2, "\t", $5al contrario print $2 "\t" $5, stai scrivendo il 2 ° campo seguito da OFS (spazio), TAB, OFS e il 5 ° campo.
Stéphane Chazelas,

Risposte:


12

L'errore sta dando il nome del file da elaborare nello script; è necessario rimuovere employee.txtdallo script ed eseguirlo come segue

awk -f awktest1.awk employee.txt

o anche, se lo script è eseguibile,

./awktest1.awk employee.txt

La sceneggiatura diventa

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

Così com'è, awkè in attesa di input da input standard invece di leggere da un file. Ecco perché non finisce mai ...


12

A complemento della risposta di @Stefn , se si desidera codificare il nome del file di input nello awkscript, è necessario scrivere:

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

Per diversi file:

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

O se non vuoi passare il nome file employee.txtcome argomento della riga di comando, puoi fare qualcosa del genere:

Codice:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.