2016-04-15 14 views
0

Ich habe eine Zuweisung, wo ich die Anzahl der Wörter in jeder .c .cc und .h Datei zählen muss. Das Problem ist, es zeigt weiterhin den Syntaxfehler in Zeile 8 und 10 bei oder nahe {Dies ist kein fertiges Skript! Es könnte einige andere Probleme haben, aber ich brauchte nur Hilfe mit dem Syntaxfehler!Syntaxfehler bei oder nahe {

awk 'BEGIN {FS=" ";drb=0;valt=0;} 
     {if (valt == 0){ 
     for(i=1; i<=NF; i++) 
      drb++; 
     valt++; 
     } 
     else{ 
     FNR==1{ printf "File name: %s,Word count: %d\n",FILENAME, drb;drb=0;} 
     for(i=1;i<=NF;i++) 
       drb++;}} 
    END {printf "File name: %s,Word count: %d",FILENAME,drb }' `find $1 -name '*.c' -o -name '*.cc' -o -name '*.h'` 
+2

Dort liegt ein Syntaxfehler vor. Bedenken Sie, dass Sie eine 'if/else'-Anweisung haben. Innerhalb des "else" -Blocks haben Sie einen Ausdruck 'FNR == 1'. Wenn das eine Bedingung ist, sollte es nicht auch eine "if" Aussage haben? Wolltest du es außerhalb des BEGIN-Blocks ablegen? – kojiro

+1

Die erste Antwort zu akzeptieren, ist normalerweise eine schlechte Idee. Denken Sie darüber nach - angesichts der vielen Menschen, die diese Website nutzen, welche Chancen haben Sie, dass die erste Antwort, die Sie bekommen, tatsächlich die beste oder sogar richtig ist? Nachdem Sie eine Antwort akzeptiert haben, werden sich viel weniger Leute darum kümmern, Ihre Frage zu lesen, um Ihnen zu helfen. Gib es ein paar Stunden, nachdem du eine Frage gestellt hast, bevor du eine Antwort akzeptierst. Editiere auch dein Skript, um ein [mcve] einzuschließen, da es mit deinem Skript mehr Probleme gibt als ein Syntaxfehler und die Leute hier könnten dir bei allem helfen, wenn wir genau wissen, was du zu tun versuchst. –

+1

Wenn Sie nicht awk verwenden müssen, können Sie immer diese 'wc -w Datei file2 ...' – 123

Antwort

1

Innerhalb eines Aktionsblock der awk Bedingung Syntax ist C-wie so benötigen Sie:

if (FNR==1) { foo } 

statt

FNR==1 { foo } 

aber noch wichtiger ist, es klingt wie alles, was Sie brauchen, ist:

awk ' 
{ drb += NF } 
ENDFILE { printf "File name: %s,Word count: %d",FILENAME,drb; drb=0 } 
' files... 

Das obige verwendet GNU awk für ENDFILE. Beachten Sie, dass dies auch für leere Dateien funktioniert, was ein großes Problem für Lösungen ist, die andere awks verwenden (wenn sie FNR==1 statt einer Schleife auf ARGV[] im Abschnitt END testen), werden sie die Datei überspringen, statt ihren Namen mit Word zu drucken null zählen).

Der richtige Weg, dies mit nicht-gaffen awks zu tun (keine doppelten Dateinamen angenommen wird) ist:

awk ' 
{ drb[FILENAME] += NF } 
END { 
    for (i=1;i<ARGC;i++) { 
     fname = ARGV[i] 
     printf "File name: %s,Word count: %d",fname,drb[fname] 
    } 
} 
' files... 

Wenn Sie doppelte Dateinamen haben, können dann es noch schwieriger zu implementieren wird, so etwas wie dieses (ungetestet):

awk ' 
FNR==1 { ++cnt[FILENAME] } 
{ drb[FILENAME,cnt[FILENAME]] += NF } 
END { 
    delete cnt 
    for (i=1;i<ARGC;i++) { 
     fname = ARGV[i] 
     printf "File name: %s,Word count: %d",fname,drb[fname,++cnt[fname]] 
    } 
} 
' files... 
+1

Danke für die Hilfe! –

1

Ich glaube nicht, dass die angenommene Antwort korrekt ist. Da dies ein h/w Problem ist, werde ich Ihnen eine Vorlage zur Verfügung stellen, zu verstehen und arbeiten daran

awk 'FNR==1{if(s) print f,s; s=0; f=FILENAME} {s+=NF} END{print f,s}' files 

Hinweise: Sie bereits NF haben als die Schleifenbedingung nur verwenden. spezielle Handhabung ist für die erste Datei, kann aber auch auf andere Weise erfolgen.

Natürlich, was Sie wirklich brauchen bereits als Befehl implementiert ist wc

wc -w files 

Sie geben die Ergebnisse, die Sie benötigen, Rohr awk für Ihre Formatierung Bedürfnisse.

+0

Sie haben Recht, aber der Autor ist sich vollkommen bewusst. Sieh dir ihren Kommentar an: "Danke! Es hat funktioniert! Ja, es hätte in einer if/else-Erklärung sein sollen". Sie arbeitete am Drehbuch, blieb stecken und bat um Hilfe zu diesem speziellen Thema. –

+0

Nun, technisch haben Sie den Syntaxfehler behoben ... Es ist eine Lernerfahrung für alle. – karakfa

+0

Ich besteht darauf, dass Ihre Antwort besser ist. Ich bin froh, dass Sie noch mehr Einblicke in die Frage geben können. –

Verwandte Themen