2016-04-06 32 views

Antwort

1

Mit awk können Sie dies ganz einfach:

awk -F 'man' '{print (NF?NF-1:0)}' file 

1 
0 
2 

-F 'man' Sätze Eingabefeld Separator als man und NF druckt Anzahl der Felder für jede Zeile.

Im Fall, dass Sie die volle Wörter verwenden dann diese gnu-awk zählen:

awk -F '(^|[^[:alnum:]])man([^[:alnum:]]|$)' '{print (NF?NF-1:0)}' file 
+0

Ich kann nicht sagen, ob diese Lösung janky oder schön ist. –

+0

Es ist erwähnenswert, dass dies Wörter zählen wird, die * auch einen Mann enthalten, eine Zeile mit Affirmation, Manager oder anderen Wörtern wie diese werfen und Sie werden diese auch zählen. Das mag keine große Sache sein, da der Fragesteller nicht spezifiziert, ob wir nur das ganze Wort Mensch oder Vorkommen dieses Textes wollen, aber dies tut das Letzte, wie es steht. Nur Leerzeichen zum Trennzeichen arg hinzufügen erhalten Sie nur das ganze Wort, z. 'awk -F 'man' '{print NF-1}' ' – zzevannn

+0

Guter Punkt @zzevannn Ich habe eine Option hinzugefügt, um auch komplette Wörter zu zählen. – anubhava

0

Wenn Sie mankind zählen wollen nicht oder: Sie können diese

awk -F '\\<man\\>' '{print (NF?NF-1:0)}' file 

Für Nicht-Gnu awk andere Zeichenfolge, die man enthält, können Sie whitespace brechen und Schleife über jedes Feld:

$ awk '{c=0; for(i=1;i<=NF;i++) if ($i~/^man$/) c++; print c}' file 

Wenn Sie eine Variable verwenden möchten:

$ awk -v m=man '{c=0; for(i=1;i<=NF;i++) if ($i==m) c++; print c FS m}' file 

Wenn Sie gawk vs POSIX awk haben, können Sie tun:

$ awk '{n=gsub(/\<man\>/, ""); print n}' file 
+1

Danke, mein Herr! –

0
$ cat file 
a man walks here 
nobody over here 

from man to man 

$ awk -v tgt="man" '{print gsub("(^|[[:space:]])"tgt"([[:space:]]|$)","&")}' file 
1 
0 
0 
2 

Die oben wird in jedem awk arbeiten, es verlässt sich nur auf den Wörtern, die durch Leerzeichen getrennt sind.

0

Wenn Sie eine Zeilennummer sehen möchten, und überspringen Linien ohne Vorkommnisse, können Sie so etwas wie

grep -no man file | uniq -c | cut -d":" -f1 | xargs printf "%d occurances in line %s\n" 
+0

OS X-Dienstprogramme fügen ein CR in Zeilen ein, wo es mehr als 1 Übereinstimmung wie 'von Mann zu Mann 'gibt, so rendert dieses Inop auf OS X – dawg

+0

@dawg Ich dachte, ich habe das mit dem' uniq -c' behoben –

0

Geben Sie dieser Version versuchen versuchen: es ermöglicht Multi-Dateien suchen und die erzeugte Ausgabe sieht wie folgt grep -nH:

#!/usr/bin/awk -f 
BEGIN { 
    word=ARGV[1]; 
    ARGV[1]=""; 
    print "Filename:Line #:" word " #:source line"; 
} 
{ 
    count=0; 
    for (i=1; i<=NF; i++) { 
    if ($i == word) { 
     count++; 
    } 
    } 
    print FILENAME ":" FNR ":" count ":" $0; 
} 

Der Test:

$ ls 
file speach.txt wordgrep.awk 

$ cat file 
a man walks here 
nobody over here 
from man to man 

$ cat speach.txt 
An old man is equal to any other man 
Petrol is not good for life 

$ ./wordgrep.awk man file speach.txt 
Filename:Line #:man #:source line 
file:1:1:a man walks here 
file:2:0:nobody over here 
file:3:2:from man to man 
speach.txt:1:2:An old man is equal to any other man 
speach.txt:2:0:Petrol is not good for life