Große Dateien auf UNIX ebene analysieren

nico_wagner

Cadet 3rd Year
Registriert
Nov. 2013
Beiträge
59
Hallo,
Ich habe mehrere GB große Dateien die ich gerne analysieren möchte. Es geht darum , dass diese ca 70 Spalten haben und ich schauen möchte, ob die Werte in einer bestimmten (48) realistisch sind. Mit welchem Befehl sollte ich das am besten machen? Ich habe bisher nur sehr wenig Erfahrung mit UNIX Befehlen und komme daher nicht wirklich zu einer Lösung:/

Mit freundlichen Grüßen,
nico_wagner
 
Wie willst Du denn überprüfen, ob die Daten "realistisch" sind? Vergleich mit dem Vorgänger, Vergleich mit dem Mittel aus n-samples, Überprüfung mittels Toleranzgrenze, oder wie genau?

welche shell?

außerdem, siehe Vorredner.
 
Wie sind denn die Spalten getrennt? Komma, Semikolon, Tabulator, Leerzeichen? Wenn vorhanden würde ich ein kleines Skript in Perl schreiben, dass die Daten rauszieht. Das geht aber auch mit der Unix-Shell, wenn kein Perl vorhanden. Dazu müsste man aber wissen, welche Shell verwendet wird. Ob ksh, csh, bash oder nur sh. Das bekommst du mit
env | grep SHELL
heraus.

VG
BassT
 
Das geht kinderleicht mit awk: `awk '{ print $48 }'`. Eventuell noch den korrekten Separator angeben, z.B.: awk -F','.
Dann kannst du deine Überprüfung auf die von awk extrahierten Werte loslassen.

Beispiel:
Code:
$ echo "a,c,b\nd,e,f" | awk -F',' '{ print $1 }' | while read val; do echo $val; done
a
d

Anstatt deine Überprüfungen in der shell zu tätigen, kannst du das natürlich auch direkt awk machen lassen:
Code:
$ echo "1,2,3\n4,5,6" | awk -F',' '{ if ($1 > 1) print $1 }'
4
 
Zuletzt bearbeitet:
Es sind .csv Dateien. Mit | getrennt. In meiner gesuchten Spalte sind nur Zahlen, in der gesamten Datei jedoch auch Wörter.
Ich mach das ganze mit dem PUTTY und die Shell ist ksh.
Den Vorschlag mit awk werde cih gleich ausprobieren. Vielen Dank schon mal!
Übrigens mit realistisch ist einmal gemeint, dass die korrektten Begriffe drin stehen und einmal ist es so, dass in den Zellen eine Zahlenfolge wie folgt steht: **-********-**** Die Sterne sind dabei Zahlen und Buchstaben. Es geht darum, dass immer dieses Muster gehalten wird. Also zwei stellen, dann 8 Stellen usw...
Ergänzung ()

Ich habe es jetzt so gemacht: cat *.csv | awk -F'|' '{print $48}'
Hat super geklappt. Danke für die Hilfe!
Ergänzung ()

Meine nächste Frage ist nun: Kann ich denn in einer Spalte die Zeilen zählen die meinetwegen 6 Stellen lang sind?
 
Zuletzt bearbeitet:
Wenn es sich um Zahlen handelt: Einfach vergleichen.
Code:
awk 'BEGIN { SUM=0; } { if ($48 >= 10^6 && $48 < 10^7) SUM++; } END { print SUM; }'

Bei deinen Mustern würde ich direkt regex mit egrep (oder wiederum awk) ansetzen:
Code:
awk '{ print $48 }' | egrep "^[[:alnum:]]{2}-[[:alnum:]]{8}-[[:alnum:]]{4}$" | wc -l
 
Zurück
Oben