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.1
usw. abzurufen.
Wie kann ich hierfür den Befehl oder verwenden ? csvgrep
Die CSV-Datei hat zwei Spalten. Die Zeilen, die Buchstaben enthalten, sollten weggelassen werden.awk
sed
Antwort1
Verwenden Sie awk
und , 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 grep
Befehl 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=C
stellen wir sicher, dass alle Bytefolgen gültige Zeichen bilden. Im C
Gebietsschema (aber oft nicht in anderen Gebietsschemas) sollte es sicher sein, 0123456789
es 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, grep
kö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 sed
und dem d
Befehl:
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.