Wie erhalte ich Zeilen aus einer CSV-Datei, die nur numerische Werte enthalten (ohne englische Buchstaben)?

Wie erhalte ich Zeilen aus einer CSV-Datei, die nur numerische Werte enthalten (ohne englische Buchstaben)?

Ich möchte Zeilen aus CSV-Dateien abrufen, die nur Zahlen enthalten. Meine Eingabedatei sieht folgendermaßen aus:

8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,

Es sollte in der Lage sein, Zahlen im oben genannten Format wie 9, 9.0.0, 8.1usw. abzurufen.

Wie kann ich hierfür den Befehl oder verwenden ? csvgrepDie CSV-Datei hat zwei Spalten. Die Zeilen, die Buchstaben enthalten, sollten weggelassen werden.awksed

Antwort1

Verwenden Sie awkund , um zu überprüfen, ob alle Felder gültige Zahlen enthalten, und überspringen Sie leere Felder.

awk -F, '{ for(i=1; i<=NF; i++) if($i+0!=$i && $i!="") next }1' infile

Antwort2

Sie können den grepBefehl wie folgt verwenden:

grep -v "[A-Za-z]" filename > filename.output

Hier ist der Test:

# cat zz2
1;2
a,1
2,B
                                                                                                                   
# grep -v "[A-Za-z]" zz2
1;2

Um leere Zeilen zu filtern, können Sie Folgendes verwenden:

grep -v "[A-Za-z]" zz2 | grep -v '^$'

Antwort3

LC_ALL=C grep -v '[^0123456789,.]' < in.csv > out.csv

Würde die Zeilen entfernen, die ein anderes Zeichen als enthalten 0123456789,.. Mit LC_ALL=Cstellen wir sicher, dass alle Bytefolgen gültige Zeichen bilden. Im CGebietsschema (aber oft nicht in anderen Gebietsschemas) sollte es sicher sein, 0123456789es durch zu ersetzen 0-9.

Für eine strengere Übereinstimmung, die vorschreibt, dass die Zeilen aus Folgen von 0 oder mehr ,getrennten Feldern bestehen müssen, die aus .getrennten Listen von 0 oder mehr Folgen von 1 oder mehr Dezimalstellen bestehen, grepkönnen Sie mit GNU Folgendes tun:

LC_ALL=C grep -xP '((\d+(\.\d+)*)?)(,(?1))*' < in.csv > out.csv

Oder POSIX:

number=[0123456789]+
field="($number(\\.$number)*)?"
LC_ALL=C grep -xE "$field(,$field)*" < in.csv > out.csv

Antwort4

mit sedund dem dBefehl:

sed '/[a-zA-Z]/d' data 

Löschen Sie die gesamte Zeile, wenn mindestens ein Zeichen gefunden wird.

Mit awk:

awk '!/[a-zA-Z]/' data

Vermeiden Sie das Drucken, wenn mindestens ein Zeichen innerhalb der Zeile gefunden wird.

verwandte Informationen