impostando l’uscita del separatore di campo in awk

Ho n’cercando la presente dichiarazione in mia script awk (in un file contenente codice separato, in modo da non in linea), nome script: stampa tabella.awk

BEGIN {FS = "\t";OFS = "," ; print "about to open the file"}
{print $0}
END {print "about to close stream" }

e in esecuzione in questo modo dalla shell

awk -f print-table.awk table

In cui la tabella è una scheda di file separato,
Il mio obiettivo è quello di dichiarare il separatore di campo (FS) e l’uscita del separatore di campo (OFS) all’interno della funzione esterna, e chiamata da shell semplicemente il

awk -f file input

senza impostare il separatore di campo nella riga di comando -F”\t”
e senza stdout di un sed dichiarazione di sostituire la scheda con una virgola,

Qualche consiglio come posso fare?

Stai solo cercando di sostituire le schede con le virgole? tr \\t , < input

OriginaleL’autore JBoy | 2013-12-30

2 Replies
  1. 14

    È necessario convincere awk che qualcosa è cambiato per farlo riformattare $0 utilizzando il OFS. Le seguenti opere anche se ci può essere un più idiomatiche modo per farlo.

    BEGIN {FS = "\t";OFS = "," ; print "about to open the file"}
    {$1=$1}1
    END {print "about to close stream" }
    Si dovrebbe fare come anubhava {$1=$1}1. Questo $1=$1 non riesce se il primo campo è 0. Non sarà vero e non essere stampati.
    Così si fa. Io avevo quello di anubhava scritto in origine, ma poi ha cercato di “golf” giù per la concisione. NF=NF evita zero problema, ma ha comunque la stringa vuota versione quindi credo che la versione più lunga.
    Ciao Etan, thx per la risposta, ma che cosa è la ragione? perché devo modificare uno dei campi o ‘falso’ di modificare uno dei campi? ho pensato che l’inizio di routine compito era quello di avviare gli attributi per essere applicata alla routine principale, a prescindere, non capisco perché è necessario un cambiamento….
    Perché chiedere non formato $0 secondo OFS a meno che non abbia a ricostruire il contenuto di $0. Fino a quando, e se, è convincere awk si deve fare, che lascia il contenuto di $0 intatto, OFS è utilizzato per l’output generato. Se hai letto il secondo per l’ultimo paragrafo del awk pagina man di Campi di sezione potrete vedere il riferimento a questo concetto.

    OriginaleL’autore Etan Reisner

  2. 6

    È necessario modificare uno dei settori in awk:

    awk 'BEGIN {FS="\t";OFS=","; print "about to open the file"} {$1=$1}1' file
    ehi Anubhava, cosa fa il 1. dopo l’ {$1=$1} significa? anche, si dice “è necessario modificare una del campo”, ma per quanto ne so “io di solito uso bash” , $1=$1, non altera $1, riassegna lo stesso valore.
    Sì intendevo riassegnazione solo. $1=$1 non cambia il valore del campo, ma le forze di riformattare il record di input utilizzando l’apposito OFS virgola. Anche 1 alla fine può essere qualsiasi altro valore diverso da zero e che sostanzialmente dice awk per stampare record di input.
    In questo caso è il 1 necessario? Per esempio, anche i campi vuoti vengono stampati senza di essa: echo ",0,eh" | awk 'BEGIN {FS=",";OFS="--"} {$1=$1} {print $0}'
    Che awk può riscrivere come: awk 'BEGIN {FS=",";OFS="--"} {$1=$1} 1

    OriginaleL’autore anubhava

Lascia un commento