2017-03-18 5 views
0

ich diese Frage gestellt wurde:Ausgabe in Betrieb awk

Eine Datei hat fünf Zeilen unter der (leer) bedeutet eine Leerzeile:

alpha 
(blank) 
beta 
(blank) 
alpha beta 

auf dieser Grundlage, die die folgenden Wird die Ausgabe ausgeführt, wenn der Bash-Befehl ausgeführt wird?

cat file | awk 'BEGIN (n=0) /^$/ (n+=1) END (print "n=" n%2*3)' 

Als ich versuchte, die Datei und starten Sie den obigen Befehl I, zu schaffen habe so viele Fehler:

sh-4.2$ cat test.txt | awk 'BEGIN (n=0) /^$/ (n+=1) END (print "n=" n%2*3)'                    
awk: cmd. line:1: BEGIN (n=0) /^$/ (n+=1) END (print "n=" n%2*3)                       
awk: cmd. line:1:  ^syntax error                               
awk: cmd. line:1: BEGIN (n=0) /^$/ (n+=1) END (print "n=" n%2*3)                       
awk: cmd. line:1:    ^syntax error                             
awk: cmd. line:1: BEGIN (n=0) /^$/ (n+=1) END (print "n=" n%2*3)                       
awk: cmd. line:1:     ^unterminated regexp                          

Können Sie mir bitte helfen, was der awk Befehl tut und warum ich bin all diese Fehler bekommen?

Ich benutze online unix shell Prompt.

Antwort

3

Sie die geschweiften Klammern bekommen haben alles falsch für die awk Syntax, müssen Sie {} an Ort und Stelle von ()

awk 'BEGIN {n=0} /^$/ { n+=1 }END{print "n=" n%2*3}' file 

und Sie brauchen nicht cat ohne jeden Zweck hier zu verwenden, ist Awk durchaus in der Lage Bearbeitung von Dateien direkt.

Was der Befehl tut, ist,

  1. Im Allgemeinen awk Prozesse Datei zu einem Zeitpunkt eine Zeile Inhalt. Die Anweisungen in der Klausel BEGIN{} werden ausgeführt, bevor die Verarbeitung der Datei erfolgt. Daher werden hier alle Aktionen zum Initialisieren von Variablen ausgeführt.
  2. /^$/ ist eine regEx Syntax für ein Spiel blank Linie, um Awk Prozesse Eingangsleitungen, wenn es eine Leerzeile sieht der Teil { n+=1 } die Zählung dieser Leer Vorkommen inkrementiert. So
  3. durch die Zeit awk erfolgt die Verarbeitung der Datei, wird der Wert von n sein 2
  4. Die END ist eine ähnliche Klausel, die ausgeführt wird, nachdem alle Eingangsleitungen verarbeitet werden. Hier machen wir also normalerweise die Manipulation der Variablen/Array-Inhalte, die als Teil der Dateiverarbeitung gespeichert sind. Hier drucken wir nur den Wert von n durch eine Modulo von 2 dann tun, diesen Wert mit 3
+0

Dank multiplizieren, können Sie mir bitte helfen zu verstehen, was der Befehl tut? – user3181365

+0

Sie können 'BEGIN {n = 0}' loswerden, da es nichts nützliches tut. –