2016-06-02 5 views
1

Was ist der schnellste Weg in Linux/AIX-Unix mit bash/ksh, um einen nicht numerischen Wert in einer bestimmten Spalte einer großen CSV-Datei und die Zeilennummer zu erhalten.Schnellste Möglichkeit zur Suche nach einem nicht numerischen Wert in CSV

Lassen Sie uns sagen, dass ich Daten in folgendem Format haben,

1,AAA,486254452,1F 
2,BAF,265363,6A 
3,AFHGJ, ,3G 
... 
50000,GAJGFGS,.,5H 
... 
100000,GHFHFFS,47,6L 

die Anzahl der Zeilen in der CSV Unter Berücksichtigung 100.000 leicht sein könnte, was ist der schnellste Weg, um die Zeilennummern zu identifizieren, die in nicht-numerische Werte hat die dritte Spalte. Nicht-numerisch muss - Leerzeichen, '.'

Ich versuchte ein Shell-Skript und Schleife durch jede Zeile der Datei, aber das dauert eine Menge Zeit.

line=0 
while read lineOfCSV 
    3rdCol=`echo $lineOfCSV | cut -d ',' -f3` 
    line=`expr $line +1` 
    if ! [[ $3rdCol=~ '^[0-9]+$' ]] ; then 
    echo "Line = :$line: NON-NUMERIC VALUE :$3rdCol:" 
    fi 
done < data.csv 

lief ich den obigen Code für eine CSV-Datei mit 80000 Zeilen, es dauerte mehr als 10 Minuten zu verarbeiten. Also habe ich das Skript gestoppt und nach einer schnelleren Lösung gegoogelt. Ich konnte nichts Bestimmtes finden. Also habe ich die Frage hier gepostet.

+0

Bevor von unten keine gültigen Antworten zu akzeptieren, können Sie aktualisieren, was Ihre ursprüngliche Ausführungszeit war und welcher Faktor wurde von der effizienteste Lösung reduziert unten? – Inian

+0

können Sie bearbeiten, was nicht-numerische enthalten sollte. Was ist das? Einfaches Zitat und Punkt oder beides? "." – Chet

+0

Bitte geben Sie den ursprünglichen Code ein. –

Antwort

5
awk 'BEGIN{FS=","} $3 ~ /[^[:digit:]]/{print NR}' file 

sollte es tun.

Als eine Randnotiz wird dies auch für die Interpunktionen und Leerzeichen in der dritten Spalte bellen.

+0

Hinzufügen der tatsächlichen übereinstimmenden Zeile zusammen mit der Zeilennummer würde nicht zu sehr weh tun? '{druck NR, $ 0}'? – Inian

+0

@Inian: Das ist jedoch nicht in der Anforderung. – sjsam

+0

Einverstanden, aber hätte dies eine noch schönere Lösung gemacht! abgestimmt! – Inian

3

Perl ist in der Regel sehr schnell für diese Art von Aufgabe:

perl -F, -ane '$F[2] =~ /\D/ and print "$.\n"' file 
+0

handeln würde eine Randnotiz, wie diese besser ist als die andere Lösung. –

+1

Das OP bittet um "den schnellsten" Weg. Dies könnte schneller als awk sein. –

Verwandte Themen