Mit awk wird die Anzahl der Vorkommen eines Worts in einer Spalte gezählt

7
%Vor%

Ich versuche, awk zu verwenden, um die Anzahl der Vorkommen des Wortes "block" und "access" oben in einem Befehl zu zählen.

Ich habe zuerst das Wort "Block" ausprobiert, aber mein Zähler scheint nicht zu funktionieren. Kann jemand sehen, wo mein Code falsch ist?

%Vor%     
user3578872 16.01.2015, 14:43
quelle

5 Antworten

19

Verwenden Sie ein Array

%Vor%

Wenn Sie speziell "blocken" wollen: END {print count["BLOCK"]}

    
glenn jackman 16.01.2015 14:47
quelle
4

Der Grund dafür, dass Ihr Code möglicherweise nicht funktioniert, ist END unterscheidet zwischen Groß- und Kleinschreibung, daher prüft Ihr Skript die Variable end exists (was nicht der Fall ist) und der letzte Block wird nie ausgeführt. Wenn Sie das ändern, sollte es funktionieren.

Sie benötigen auch nicht den BEGIN -Block, da alle Variablen bei 0 instanziiert werden.

Unten habe ich einen alternativen Weg hinzugefügt, den Sie stattdessen verwenden könnten.

Dies ist ähnlich wie glenn's, aber nimmt nur die Wörter gefangen, die Sie wollen, es sollte deshalb wenig Speicher verwenden.

Mit Gawk (für den dritten Arg des Matches)

%Vor%

Dieser Block wird nur ausgeführt, wenn BLOCK oder ALLOW im dritten Feld enthalten sind.
Die Übereinstimmung erfasst, was mit dem Array b verglichen wurde.
Dann wird Array a für das übereinstimmende Feld inkrementiert.

Im Block END wird jedes erfasste Feld mit einer Anzahl von Vorkommen ausgegeben.

Die Ausgabe ist

%Vor%     
user4453924 16.01.2015 14:59
quelle
3

Hier ist eine Nicht-Code-Lösung. Sie können die Schritte mit Pipes ("|") aneinanderreihen.

%Vor%
  • Katzendatei
    lese die Datei und sende sie an stdout (das nächste Programm in der Pipe

  • )
  • awk '{Druck $ 3}'
    Drucken Sie die 3. Spalte, das Standard-Trennzeichen in awk ist Leerraum.

  • sortieren
    Sortiere die Ergebnisse

  • uniq -c
    Zählen Sie die Anzahl der Wiederholungen

David Thornton 06.12.2016 20:09
quelle
2

Ich habe deine Aussage getestet

%Vor%

und konnte BLOCK erfolgreich zählen, indem zwei Änderungen durchgeführt wurden

  1. end sollte in Großbuchstaben
  2. stehen
  3. entferne $ von print $count

Also sollte es sein:

%Vor%

Eine einfachere Aussage, die auch funktioniert, ist:

%Vor%     
psoo 23.08.2017 16:36
quelle
1

Der Fehler in Ihrem awk Aufruf ist, dass Sie in Ihrem "END" -Block print $count haben. Das nimmt den Inhalt der count -Variablen, nimmt an, dass es eine ganze Zahl ist, und versucht, das entsprechende Feld in der letzten Zeile der Eingabe zu finden. Was Sie wirklich wollen, ist nur print count , da dies nur den Wert in der Variable count ausgibt. Es ist manchmal einfach, verschiedene Variablenreferenzierungsschemata zwischen bash , awk , python usw. zu mischen, daher ist es ein leichter Fehler, dies zu tun.

    
twalberg 16.01.2015 16:35
quelle

Tags und Links