2017-02-01 3 views
1

ich eine CSV-Datei haben, möchte ich nicht der Datensätze zählen, die haben NF (keine Felder), die gleich einer bestimmten Anzahl tut,Anzahl der Datensätze wenn nein. von Feldern auf eine bestimmte Variable nicht gleich sind

ich versucht habe

nawk '{print NF}' FS='|' "$CSVFILE" | grep "$Variable" | nawk '{print $1}' | sort | uniq -c 

hier csvfile ist jede CSV Datei und Variable ist eine beliebige Zufallszahl, die außer Benutzer, wenn die Datei finden enthalten, dass keine der Felder oder nicht

ist es eine Möglichkeit, es nur durch awk verwenden können

Beispieleingabedatei

dsdgh||@jhsjdh||jdhjdhfu|123| 
#45ghf|123|laiej|||| 
|hyrhyf|||fhyr|@#$%| 

Angenommen, ich habe keine der Felder, wie viele Datensätze überprüfen möchten nicht equlas bis 5

so erwartete Ausgabe 3, da alle 3 Rekord sein sollte NF kleiner oder größer als 5

+0

Seien Sie vorsichtig, um sich zu erholen, wenn das Feld Separator '|' dann die Zeile '| hyrhyf ||| fhyr | @ # $% | 'hat sieben Felder (dh" NF "== 7). Wenn unter Anzahl von Feldern nicht leere Felder gemeint sind, ist das eine etwas andere Frage. – jas

+0

@jas | hyrhyf ||| fhyr | @ # $% | wird sieben Felder haben, und durch NF hier meine ich nicht leer sowie beide leer, das ist unabhängig von Aufzeichnungen – Chandan

Antwort

2

Increment die Zählung, wenn NF nicht gleich n ist und die Zählung am Ende drucken:

awk -F"|" -v n=5 'NF!=n{COUNT++} END{print COUNT}' Input_file 
+0

OP fragt Nummer der Zeile statt der entsprechenden Zeilen? – NeronLeVelu

+0

@NeronLeVelu: Ich hatte bearbeitet, bevor hek2mgl meine Post mit der Antwort bearbeitet, die die Summe der Zeilen gibt, die nicht gleich der Anzahl der vom Benutzer usw. bereitgestellten Felder sind. – RavinderSingh13

+0

Die vorherige Antwort (Vorbearbeitung) war nett: es war einfacher und nur durch Piping in "wc" hätte die Anzahl der Zeilen gedruckt. – linuxfan

1

Spezifische zu Ihrer Datei ist

Unter der Annahme,

  • VarNumber eine gültige ganze Zahl (nicht Teil der Anforderung, dies zu sichern)
  • Datei (en) besteht und sind readeable

Die kommentierten Code

awk -F '[|]' -v NotEqualTo="${VarNumber}" ' 
    # if record have number of field NOT equal to given number 
    NF != NotEqualTo { 
     # Count the line 
     c++ 
     } 

    # at end of file 
    END { 
    # print the count (only) 
    print c 
    } 
    ' YourFile 

Hinweis:

  • -F '[|]' jedes Missverständnis mit dem RegEx zu vermeiden, mit OR je Option/config verwendet
  • VarNumber die Chargengröße mit der Anzahl Ihres Feldes, die

Generika für viel Datei

ausgeschlossen
awk -F '[|]' -v NotEqualTo="${VarNumber}" ' 
    # Count if NF is NOT the number given and put info in array 
    # 1 entry by file name 
    NF != NotEqualTo {c[FILENAME]++} 

    # at end of file, print the count (only) for each file (eement of array) 
    END { for(f in c) print f " : " c[f] } 
    ' YourFiles* 
+0

'awk -F '|' -v num 'NF! = num {C++} ENDE {print c}' 'wäre genug gewesen und einfacher zu lesen - imo. – hek2mgl

+0

Was ist der Unterschied, ich meine auf die Code-Aktion? – NeronLeVelu

+0

Verlegen Sie beide Befehle zum 'wc -c' und vergleichen Sie die Ergebnisse. Das ist der Unterschied;) Wenn auf der Code-Ebene "FS" nur ein einzelnes Zeichen ist, werden die Felder durch dieses Zeichen begrenzt. 'FS' ist in diesem Fall kein regulärer Ausdruck. Sie müssen nicht '[|]'. Sie können einfach '' '' – hek2mgl

1

das Sie die vollständige Verteilung der Anzahl der Felder geben

$ awk -F\| '{c[NF]++} END{for(i in c) print i ":", c[i]}' file | sort 

, dass aus Sicht des awk erinnern alle, aber gleich 5, Rohr zu einem anderen awk

$ ... | awk '!/^5:/{sum+=$2} END{print sum}' 
Verwandte Themen