2016-04-25 7 views
2

TabelleWie kann man Fälle zählen, egal in welchem ​​Fall?

chr10 10482 10484 0 11 + CA 
chr10 10486 10488 0 12 + ca 
chr10 10487 10489 0 13 + Ca 
chr10 10490 10492 0 13 + cA 
chr10 10491 10493 0 12 + CT 
chr10 10494 10496 6.66667 15 + ca 
chr10 10495 10497 6.66667 15 + cc 

I die Zählung der Anzahl der Zeilen in der Spalte 7 möchte, wo „CA“ kann in Groß- oder Kleinbuchstabe zu sein, unabhängig von dem einen der beiden Buchstaben gefunden werden.

Das würde gewünschte Ausgangs 5. sein

Die beiden Befehle (unten) geben eine leere Ausgabe

cat table | awk ' $7 ==/^[Cc][Aa]/{++count} END {print count}' 

awk 'BEGIN {IGNORECASE = 1} $7==/"CA"/ {++count} END {print count}' table 

Der unterhalb Befehl ein Wert von 1

awk 'BEGIN {IGNORECASE = 1} END {if ($7=="CA"){++count} {print count}}' table 

Hinweis liefert: my Die tatsächliche Tabelle ist mehrere zehn Millionen Zeilen lang, daher möchte ich keine Tabelle als Zwischenprodukt schreiben, um zu zählen. (Ich muss diese Aufgabe auch für andere Dateien wiederholen).

+1

Bitte beachten Sie, dass IGNORECASE nur eine Funktion von GNU awk (gawk) ist und nicht in anderen awk-Implementierungen verfügbar ist. – ghoti

+0

Würde auch 'grep -c -w -i 'ca $' table' nicht ausreichen? Oder bauen Sie neben dem Zählen noch weitere Funktionen in Ihr awk-Skript ein? – ghoti

Antwort

3

Es gibt ein kleines Problem in Ihrer Syntax: Sie sagen entweder var == "string" oder var ~ regexp, aber Sie sagen var ~ /"string"/. die richtige Kombination unter Verwendung macht den Befehl Arbeit:

$ awk '$7 ~ /^[Cc][Aa]/{++count} END {print count+0}' file 
5 
$ awk 'BEGIN {IGNORECASE = 1} $7=="CA" {++count} END {print count+0}' file 
5 

Auch Sie toupper() (oder tolower()) verwenden möchten, dies zu überprüfen, anstatt die IGNORECASE Flagge mit:

awk 'toupper($7) == "CA" {++count} END {print count+0}' file 

Hinweis der Trick Drucken count + 0 anstelle von nur count. Auf diese Weise wird die Variable in 0 umgewandelt, wenn sie vorher nicht festgelegt wurde. Damit wird 0 gedruckt, wenn keine Übereinstimmungen vorhanden sind. Wenn wir nur print count würden, würde es eine leere Zeichenfolge zurückgeben.

+0

Ich habe die Syntax awk 'BEGIN {IGNORECASE = 1} $ 7 == "CA" {++ Zählung} END {print count}' Datei verwendet und das hat in der Tat funktioniert – user3146560