• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] csv dateien Spaltenweise und Zeilenweise

ceddshot

Newbie
Lösung dank eurer Hilfe:
Code:
#!/bin/bash
while read line
do
        timestamp=$(echo $line | cut -d";" -f1 | cut -c1-9)
        total=$(echo $line | cut -f2 -d";")
        usedPlusExclusiv=`grep -E "^${timestamp}" total.csv | cut -f6 -d";"`
        if [ -z $usedPlusExclusiv ]
        then egal="scheissegal"
        else
        intTotal=$(printf %.0f $total)
        intusedPlusExclusiv=$(printf %.0f $usedPlusExclusiv)
        if [ $intTotal -gt $intusedPlusExclusiv ]
        then
        echo "Fehlermeldung: ${timestamp}. ${intTotal}>${intusedPlusExclusiv}"
        fi
        fi
done < efficiency2.csv
Hallo zusammen,

da ich neu hier bin und dies mein erster Beitrag ist wollte ich erst mal alle herzlich willkommen heißen.

Nun zu meinem Problem:
Ich habe noch wirklich kaum bis keine Erfahrungen mit der Linux Bash, da ich erst seit eienr Woche mit Linux arbeite und leider keine ähnlichen Probleme per Forums durchforstung und googlens gefunden habe.

Ich habe zwei CSV Dateien die ich jeweils miteinander vergleichen muss.
folgend seht ihr jeweils einen Ausschnitt dieser 2 Dateien:
efficiency.csv
timestamp total system1 system2 system3 system4 system5
1368226503 157545.183960525 3176.3467296756 2813.7482884704 8790.0145364277 5211.0514319366 0
1368226804 23520.6075705172 3158.6045286046 2631.6138314475 8831.964795268 5192.5968159659 0
1368227103 23298.2506406901 3152.1759124436 2632.659642212 8595.5485819866 5193.9545893496 0
1368227403 23489.5663755255 3247.2633542966 2632.2997355733 8664.2182457893 5198.3045302722 0

total.csv
timestamp partition cores_available cores_usable cores_used cores_used + exclusiv cores_uses + reserved
1368226501 total 34020 32500 25814 26248 30520
1368226801 total 34020 32500 25631 26069 30264
1368227101 total 34020 32468 25633 26081 30309
1368227401 total 34020 32500 25974 26308 30569

Wie unschwer in der efficiency.csv zu erkennen ist, gibt es einen Ausreißer in der Spalte "total"
Nun muss ich hingehen, mir den timestamp packen und diesen in der Total.csv aufsuchen und prüfen, ob dieser Wert größer als der Wert ist, der zur selben Zeit in Spalte 6 der anderen (total.csv) Datei vorhanden ist.

Da die Dateien jedoch mehrere 100000 Zeilen lang sind brauche ich ein Script, was Zeile für Zeile prüft, ob der eine Wert größer ist, als gleicher Wert in der anderen
Ich hoffe ihr könnt mir weiterhelfen oder zumindest ein paar tipps und anhaltspunkte und anregungen geben :))

Mit freundlichen Grüßen,
ceddshot
 

Feuervogel

Hacker
Hallo abgdf,

also mir ist er sofort in's Auge gesprungen:

ceddshot schrieb:
efficiency.csv
timestamp total system1 system2 system3 system4 system5
1368226503 157545.183960525 3176.3467296756 2813.7482884704 8790.0145364277 5211.0514319366 0
1368226804 23520.6075705172 3158.6045286046 2631.6138314475 8831.964795268 5192.5968159659 0

Eine sechsstellige Zahlenfolge, ansonsten nur fünfstellige Zahlenfolgen in der betreffenden Spalte.

Gruß
Feuervogel
 

abgdf

Guru
Ok.
Hier mal ein Perl-Skript:
Code:
#!/usr/bin/perl

use warnings;
use strict;

use Tie::File;

my $SEP = " ";

tie(my @eff, 'Tie::File', "efficiency.csv") || die;
tie(my @total, 'Tie::File', "total.csv") || die;

my $i; my $u;

foreach $i (@eff) {
    chomp($i);
    my @effl = split($SEP, $i);
    my $effts = $effl[0];
    if ($effts eq "timestamp") {
        next;
    }
    my $efftotalval = $effl[1];
    foreach $u (@total) {
        chomp($u);
        my @totall = split($SEP, $u);
        my $tts = $totall[0];
        if ($tts eq "timestamp") {
            next;
        }
        # print "$tts\t$effts\n";
        if ($tts != $effts) {
            next;
        }
        if ($efftotalval > $totall[5]) {
            print "Found:\nefficiency.csv:\n$i\ntotal.csv:\n$u\n\n";
        }
        last;
    }
}

untie(@eff);
untie(@total);
Das Blöde ist, es läßt sich schlecht testen. Denn: Der Timestamp mit dem Ausreißer "1368226503" ist nicht in der "total.csv" enthalten!
 

framp

Moderator
Teammitglied
ceddshot schrieb:
...Nun muss ich hingehen, mir den timestamp packen und diesen in der Total.csv aufsuchen ...
Den Daten nach sind die Timestamps nicht exakt identisch. Die Frage ist ob dann der davorliegende oder nachfolgende Wert aus der Zeile genommen werden soll. Ausserdem ist die Frage ab wann man von einem Ausreisser sprechen kann, d.h. wie gross Schwankungen maximal auftreten koennen.

Ein moeglicher Ansatz waere beide Datensaetze sortiert zusammenzufuehren und dann durchzugehen und zu pruefen und dann die davorliegende oder nachfolgende Zeile nimmt um die Werte zu vergleichen. Voraussetzung ist, das die beiden Zeilen unterscheidbar sind was wohl gegeben ist (einmal Gleitkommazahlen und einmal nur Festkommazahlen)
 
A

Anonymous

Gast
Ansich ist die Aufgabenstellung nicht genau genug definiert um hier etwas auf Anhieb richtiges zu programmieren.
Ein bisschen kann man sich ja denken, aber was soll genau passieren wenn du einen größeren Wert gefunden hast.

Da hier schon für einen Anfänger ein nicht verständliches Perl script angekommen ist, hier noch ein absolut unverständliches awk Script dazu. ;)
Mit der reine Bash ist hier nicht viel auszurichten, bzw es würde noch extrem komplizierter werden.
Das Problem mit den nicht genau stimmenden Zeitstempeln habe ich mit ein bisschen intelligentem Runden beseitigt.
Code:
#!/usr/bin/awk -f

# awk Script test.awk
# Aufruf : ./test.awk efficiency.csv total.csv

function round_time(T)
{
  return int((T+9)/10)
}

BEGIN { rulesfile="" }
$1 ~ "timestamp" {next}
rulesfile == "" { rulesfile = FILENAME; }
rulesfile == FILENAME { x[round_time($1)]= int($2); z[round_time($1)]= $0 }
rulesfile != FILENAME { y[round_time($1)]= $6 }

END { for (i in x){
         if ((y[i]>0) && (y[i] < x[i])) {
            printf("%s : %s\n","Ausreiser ",z[i])
        }
    }
}
Als Datei namens "test.awk" speichern und die Ausführungsrechte darauf vergeben,
Aufruf dann
Code:
./test.awk efficiency.csv total.csv
Als Ergebniss habe ich mal die Ausreiserzeilen als Ausgabe definiert, (Vorsicht: die Ergebnisse kommen nicht Zeitsortiert zur Ausgabe)
Code:
robi@linux-akasa:~/test1> ./test.awk efficiency.csv  total.csv
Ausreiser  : 1368226503 157545.183960525 3176.3467296756 2813.7482884704 8790.0145364277 5211.0514319366 0

robi
 
ceddshot schrieb:
da ich neu hier bin und dies mein erster Beitrag ist wollte ich erst mal alle herzlich willkommen heißen.
Willkommen im Forum. :)

ceddshot schrieb:
Ich habe zwei CSV Dateien die ich jeweils miteinander vergleichen muss
Code:
diff efficiency.csv total.csv
bringt folgendes:
Code:
1,5c1,5
< timestamp     total                   system1         system2         system3         system4         system5
< 1368226503    157545.183960525        3176.3467296756 2813.7482884704 8790.0145364277 5211.0514319366 0
< 1368226804    23520.6075705172        3158.6045286046 2631.6138314475 8831.964795268  5192.5968159659 0
< 1368227103    23298.2506406901        3152.1759124436 2632.659642212  8595.5485819866 5193.9545893496 0
< 1368227403    23489.5663755255        3247.2633542966 2632.2997355733 8664.2182457893 5198.3045302722 0
---
> timestamp     partition       cores_available cores_usable    cores_used      cores_used + exclusiv   cores_uses + reserved
> 1368226501    total           34020           32500           25814           26248                   30520
> 1368226801    total           34020           32500           25631           26069                   30264
> 1368227101    total           34020           32468           25633           26081                   30309
> 1368227401    total           34020           32500           25974           26308                   30569
Das Programm diff muss eventuell erst installiert werden, wie man es benutzt kannst Du in der Manpage nachlesen:
Code:
man diff
die es nahezu zu allen Programmen gibt.
Als erstes solltest Du dringend lernen Ausgaben aus der Konsole/dem Terminal in Code-Tags zu setzten um die Textformatierung zu erhalten was die Übersichtlichkeit erhöht.
Ich habe das mal für Dich nachgeholt.

ceddshot schrieb:
folgend seht ihr jeweils einen Ausschnitt dieser 2 Dateien:
efficiency.csv
Code:
timestamp       total                   system1         system2         system3         system4         system5
1368226503      157545.183960525        3176.3467296756 2813.7482884704 8790.0145364277 5211.0514319366 0
1368226804      23520.6075705172        3158.6045286046 2631.6138314475 8831.964795268  5192.5968159659 0
1368227103      23298.2506406901        3152.1759124436 2632.659642212  8595.5485819866 5193.9545893496 0
1368227403      23489.5663755255        3247.2633542966 2632.2997355733 8664.2182457893 5198.3045302722 0

total.csv
Code:
timestamp       partition       cores_available cores_usable    cores_used      cores_used + exclusiv   cores_uses + reserved
1368226501      total           34020           32500           25814           26248                   30520
1368226801      total           34020           32500           25631           26069                   30264
1368227101      total           34020           32468           25633           26081                   30309
1368227401      total           34020           32500           25974           26308                   30569

ceddshot schrieb:
Wie unschwer in der efficiency.csv zu erkennen ist, gibt es einen Ausreißer in der Spalte "total"
Du meinst das der Wert dort mit 1 beginnt während alle anderen mit 2 beginnen?

ceddshot schrieb:
Nun muss ich hingehen, mir den timestamp packen und diesen in der Total.csv aufsuchen und prüfen, ob dieser Wert größer als der Wert ist, der zur selben Zeit in Spalte 6 der anderen (total.csv) Datei vorhanden ist.
Hier ein Anfang:
Code:
#!/bin/bash

efficiency="$(cat efficiency.csv)"
timestamp1="$(echo "$efficiency" | head -2 | tail -1 | awk '{print $1 }')"
echo $timestamp1

timestamp2="$(echo "$efficiency" | head -3 | tail -1 | awk '{print $1 }')"
echo $timestamp2

timestamp3="$(echo "$efficiency" | head -4 | tail -1 | awk '{print $1 }')"
echo $timestamp3

timestamp4="$(echo "$efficiency" | head -5 | tail -1 | awk '{print $1 }')"
echo $timestamp4
obwohl ich denke das eine for-Schleife effektiver sein wird weil:
ceddshot schrieb:
Da die Dateien jedoch mehrere 100000 Zeilen lang sind

Lieben Gruß aus Hessen
 
OP
C

ceddshot

Newbie
Hallo,

erst einmal danke für eure schnelle und gute Hilfe. Zudem tut es mir Leid für die ungenauen Angaben!!!
In den Dateien geht es ja um die Nutzung der Cores. Da wir jedoch wie in der Total.csv zu sehen ist nicht über 1000000 Cores verfügen, ist klar, dass dies ein Ausreißer sein muss.
Es geht nicht darum, dass dieser mit einer eins oder 2 oder wie auch immer beginnt :)) .
Es muss nun also geprüft werden, zum einen: ist dieser Wert nachvollziehbar, der in der efficiency Datei hinterlegt ist.
Angenommen werden kann: Die Spalte cores_used + execlusiv, also die vorletzte Spalte der Total.csv MUSS kleiner sein als die Spalte total in efficiency.csv, falls dies nicht gegeben ist, soll die Zeile rausgelöscht werden. Zum anderen kann die letzte Zahl des timestamps abgeschnitten werden, da die timestamps alle 5 Minuten erscheinen und aufgrund der unterschiedlichen Berechnungsdauer ein paar Sekunden versetzt sind (300 = 5 Minuten ;)) )

Also kurz:
+timestamp letzte Zahl kürzen
+total in efficiency.csv > cores_used + exclusiv in total.csv
=> löschen der Zeilen

Falls dennoch Fragen bestehen, da ich immer Probleme habe, MEINE probleme anderen zu schildern, bitte fragt und seht dies nicht als Faulheit oder sonstiges an :D
Ich hoffe dennoch das dass jetzt alles gewesen ist.

Mfg ceddshot
 

utopos

Member
Hallo Ceddshot,


habe auch einmal über Deine Frage nachgedacht. Du solltest auf jeden Fall ein bisschen genauer beschreiben,
  • nach welchem Kriterium Ausreißer gesucht werden sollen,
  • wonach genau in der zweiten Datei gesucht wird (letzter Zeitstempel davor? Erster danach? ist die Datei immer sortiert?),
  • ob eine Chance besteht, die beiden Dateien in anderem Format zu bekommen, bevor Deine Aufgabe beginnt, und welche Variabilität es dabei gibt,
  • wie das Ergebnis weiterverarbeitet werden soll (Du sprachst von einem Zahlenvergleich. Genügt es Dir, zu erfahren, wie der Vergleich ausgeht, oder was brauchst Du noch als Ausgabe?)

Einen Schlüssel in der zweiten Datei nachzuschlagen und den Vergleich mit weiteren Werten durchzuführen ist recht einfach, es gibt viele Möglichkeiten dazu.
Der springende Punkt sind die Definition des "Ausreißers" und die Frage, welche Zeile in der zweiten Datei die relevante ist.
Auch das lässt sich lösen, aber wichtig ist natürlich, was genau Du brauchst.

ceddshot schrieb:
da ich neu hier bin und dies mein erster Beitrag ist wollte ich erst mal alle herzlich willkommen heißen.

Hier liegt ein Missverständnis vor. "Willkommen heißen" ist das, was die tun, die schon das sind. Für Dich kommt z.B. "grüßen" in Frage.

In diesem Sinne: Herzlich willkommen! :D
 

uhelp

Member
Was auch immer du herausfinden willst, lässt sich bestimmt anders leichter regeln.
Beschreibe doch einfach das Problem exakt.
Und wie werden diese Daten gewonnen? Woher stammen die?
 

utopos

Member
Oh, unsere Beiträge haben sich überschnitten. Ein paar der Fragen hast Du schon beantwortet.

Hier ein Ansatz von mir (Vorsicht - ist nicht getestet! Erfordert also wahrscheinlich ein paar Nachbesserungen):


Code:
#!/bin/bash

while read zeile
do
      timestamp=`cut -f1 -d"\t" $zeile | rev | cut -c2- | rev`
      total=`cut -f2 -d"\t" $zeile`
      usedPlusExclusiv=`grep -E "^${timestamp}" total.csv | cut -f6 -d"\t"`
      if [ $total -gt $usedPlusExclusiv  ]
      then
            echo "Welche Fehlermeldung haetten Sie denn gern? Es geht jedenfalls um ${timestamp}."
      fi
done

in einer Datei abspeichern, etwa unter dem Namen "Uhrenvergleich".
Ausführrechte setzen. Im Verzeichnis, in dem es liegt, ausführen als

Code:
./Uhrenvergleich efficiency.csv


Erklärung:

Das ist ein kleines Shell-(Bash-)Skript.
Die while-Schleife liest eine Zeile nach der anderen, bei dem genannten Aufruf aus der gewünschten Datei efficiency.csv, und bearbeitet sie einzeln.
Im Folgenden ist der cut-Befehl wichtig, der einzelne Stellen aus dieser Zeile herausschneidet.
Als erstes rufen wir cut -f1, das heißt, die Zeile wird in Felder zerteilt und das erste Feld als Ergebnis genommen. Der Feldbegrenzer ist bei Dir leider der Tabulator, wie es scheint; er muss anch Der Option -d angegeben werden - ich hoffe, dass "\t" es tut; u.U. muss man diese Zeichen ändern.

Dabei kommt der Zeitstempel heraus, denn der steht in jeder Zeile ja zu Beginn.

Als nächstes wird dieses Ergebnis weiterverarbeitet (Pipe-Symbol |) und die letzte Stelle abgeschnitten. Dies geht auch wieder mit "cut", diesmal "cut -c" für "character". "cut -c2-" heißt, schneide alles ab dem zweiten Zeichen heraus (d.h. lass das erste Zeichen weg). Halt! Wir wollen doch die letzte Stelle unterdrücken? Dafür sind die "rev"-Befehle da, die die Zeichenkette umdrehen. Das Ergebnis ist genau der gewünschte ungenauere Zeitstempel. (Das geht natürlich auch direkter als mit zweimaligem Umdrehen, aber ich finde diese Variante immer am angenehmsten zu lesen und zu schreiben).

Auf ähliche Weise besorgt sich das Skript die beiden Werte, die verglichen werden sollen, aus den beiden Dateien.
Für den Querverweis auf "total.csv" verwende ich "grep", das hier die Zeile aus der Datei nimmt, die mit dem eben ermittelten Zeitstempel beginnt (dafür steht das ^).

Schließlich gibt es eine Fehlermeldung, wenn der Vergleich unplausibel ausgeht (-gt: greater than).

Ich hoffe, das hilft Dir weiter?
 

boser

Member
Hallo,

wo ich mir jetzt den Beitrag mal durchlese, ist mir gleich ein Gedanke aufgeblitzt.
Kann man die beiden csv-Dateien nicht in eine Tabellendokument importieren , um dann die Ausreißer mit bedingte Formatierung finden ?

Nur so als Anregung.
 

utopos

Member
@boser:

  • Zusätzlich bräuchte man dann wie auch immer geartete Verweis-Funktionen, und die beiden Dateien abzumischen.
  • Bei 100000 Zeilen kann ich mir dabei vorstellen, ziemlich lange auf einen sich nicht aktualisierenden Bildschirm starren zu müssen. Auch sind meines Wissens Verweisfunktionen bei solchen Datenmengen nicht mehr unbedingt zuverlässig.
  • Wenn man das häufiger machen möchte, muss man das Einlesen der Dateien und Filtern nach Ausreißern jedes Mal händisch durchführen. Das kann - je nach Häufigkeit - nicht nur sehr zeitraubend sein, sondern auf die Dauer auch fehleranfällig, da der Benutzer wichtige Schritte selbst durchführen muss.
 

boser

Member
Es gäbe natürlich bei der menge von Datensätze , auch die Möglichkeit mit einer Datenbank zu arbeiten, da:

1.) mit "bulk in" , die Datei automatisch eingelesen werden kann. Einmal eingerichtet und es läuft fast automatisch.
2.) Mit SQL-Statement bekommt man schnell ein Überblick, sogar bei 10000 Datensätze.

das müsste sogar schneller laufen, als irgendwelche Scripte, die Datensatz für Datensatz einliest und vergleicht.
Was aber noch zu untersuchen wäre. ist wieder nur ein Vorschlag.
Über die Größe und das aussehen der Vergleichsdateien wurde bisher nichts gesagt.
Deshalb würden mich die Rahmenbedingungen , bzw. Randbedingungen interessieren.
 

abgdf

Guru
ceddshot schrieb:
In den Dateien geht es ja um die Nutzung der Cores. Da wir jedoch wie in der Total.csv zu sehen ist nicht über 1000000 Cores verfügen, ist klar, dass dies ein Ausreißer sein muss.
Es geht nicht darum, dass dieser mit einer eins oder 2 oder wie auch immer beginnt :)) .
Es muss nun also geprüft werden, zum einen: ist dieser Wert nachvollziehbar, der in der efficiency Datei hinterlegt ist.
Angenommen werden kann: Die Spalte cores_used + execlusiv, also die vorletzte Spalte der Total.csv MUSS kleiner sein als die Spalte total in efficiency.csv, falls dies nicht gegeben ist, soll die Zeile rausgelöscht werden.
Das klingt nach Unternehmensrechnern. Ich leiste hier aber nicht unbezahlten Support für Unternehmen. Ich verstehe das Forum vielmehr als Selbsthilfe für Gleichgesinnte (Linux-User).

ceddshot, ich schlage Dir also vor, Perl zu lernen. Damit kannst Du sowas gut machen. Oben hatte ich ein Beispielskript gepostet, das aber nur teilweise das leistet, was Du Dir vorstellst. Als Sys-Admin in einem Unternehmen, der unter anderem Core-Werte der Linux-Rechner auswerten muß, wird man in jedem Fall immer wieder bash und Perl brauchen. Auch in Zukunft.
Beachte die Grafik "Usefulness to career success":

http://xkcd.com/519/
 

framp

Moderator
Teammitglied
Ob es nun Perl sein muss muss der TE für sich entscheiden ;) Der Vorschlag von utopos in bash wie auch Robis Vorschlag mit awk sind weitere Samples auf die er aufbauen kann. Python fehlt noch - aber der TE hat ja explizit bash genannt. Also brauche ich kein Sample in Python zusammenzubauen :lol:
 

abgdf

Guru
framp schrieb:
aber der TE hat ja explizit bash genannt.
Wahrscheinlich hat er gar keine Vorstellung von den Möglichkeiten der Skriptsprachen, so daß bash zunächst mal das einzige war, was er kannte. Wenn er alle Skriptsprachen im Überblick kennen würde, würde er wahrscheinlich nicht bash für die Lösung des Problems wählen.
framp schrieb:
Ob es nun Perl sein muss muss der TE für sich entscheiden
Ich hatte Perl genannt, weil es, soweit ich weiß, traditionell das typische Werkzeug von Systemadministratoren für kurze, spezielle Datenverarbeitungsaufgaben (wie diese) ist.
Ob Python Perl da inzwischen abgelöst hat, ist mir nicht bekannt.
Aber sicher: Er kann wählen, was er will. Sogar awk. :mrgreen:
 

framp

Moderator
Teammitglied
abgdf schrieb:
...Wahrscheinlich hat er gar keine Vorstellung von den Möglichkeiten der Skriptsprachen, so daß bash zunächst mal das einzige war, was er kannte. Wenn er alle Skriptsprachen im Überblick kennen würde, würde er wahrscheinlich nicht bash für die Lösung des Problems wählen.
Warum nicht? Ein Weg ist oben zu finden. Wenn auch nicht ganz performant weil mit grep immer die ganze Datei von vorne durchsucht wird - aber das Script ist straight forward und wird in endlicher Zeit zum Ziel führen.
abgdf schrieb:
...Ich hatte Perl genannt, weil es, soweit ich weiß, traditionell das typische Werkzeug von Systemadministratoren für kurze, spezielle Datenverarbeitungsaufgaben (wie diese) ist.
Ob Python Perl da inzwischen abgelöst hat, ist mir nicht bekannt.
Eine Menge OpenSource Projekte benutzen Python extensiv. Ich weiss dass da keine Systemadministratoren am Programmieren sind - aber es wird seinen Grund haben warum sie da nicht Perl nehmen :roll:
abgdf schrieb:
...Aber sicher: Er kann wählen, was er will. Sogar awk. :mrgreen:
Hast Du was gegen awk? Ich finde die Lösung von Robi in awk recht elegant. awk ist zwar nicht ganz einfach zu Anfang aber wenn man die Konzepte verstanden hat sehr mächtig.
 

abgdf

Guru
framp schrieb:
abgdf schrieb:
...Wahrscheinlich hat er gar keine Vorstellung von den Möglichkeiten der Skriptsprachen, so daß bash zunächst mal das einzige war, was er kannte. Wenn er alle Skriptsprachen im Überblick kennen würde, würde er wahrscheinlich nicht bash für die Lösung des Problems wählen.
Warum nicht? Ein Weg ist oben zu finden. Wenn auch nicht ganz performant weil mit grep immer die ganze Datei von vorne durchsucht wird - aber das Script ist straight forward und wird in endlicher Zeit zum Ziel führen.
Die Spalten sind z.B. durch Leerzeichen getrennt. Wenn grep jetzt als Ergebnis eine Zeile ausgibt und man die weiterverarbeiten will, muß man viel mit "", '' und Backslashes arbeiten. Wenn man (großes) Pech hat, schafft man's gar nicht mehr, der Leerzeichen Herr zu werden, so wie z.B. hier. Es mag gehen (C und Assembler würden auch gehen), aber es ist unbequem.
framp schrieb:
abgdf schrieb:
...Ich hatte Perl genannt, weil es, soweit ich weiß, traditionell das typische Werkzeug von Systemadministratoren für kurze, spezielle Datenverarbeitungsaufgaben (wie diese) ist.
Ob Python Perl da inzwischen abgelöst hat, ist mir nicht bekannt.
Eine Menge OpenSource Projekte benutzen Python extensiv. Ich weiss dass da keine Systemadministratoren am Programmieren sind - aber es wird seinen Grund haben warum sie da nicht Perl nehmen :roll:
Sicher, die sind ja alle hier ausführlich dargestellt. Für große/größere Projekte würde ich auch immer Python nehmen (hab' ich auch).
Aber gerade bei so kleinen "quick'n dirty"-Skripten oder gar bei Einzeilern ist Perl irgendwie immer noch charmant.
framp schrieb:
abgdf schrieb:
...Aber sicher: Er kann wählen, was er will. Sogar awk. :mrgreen:
Hast Du was gegen awk? Ich finde die Lösung von Robi in awk recht elegant. awk ist zwar nicht ganz einfach zu Anfang aber wenn man die Konzepte verstanden hat sehr mächtig.
Schon von Perl wird gesagt, wenn nicht unverzüglich die Umstellung auf Perl6 gelinge (was eigentlich eine ganz andere Sprache als Perl5 ist), dann sei Perl tot. Hört man immer wieder. Eben wegen der Konkurrenz durch Python. Obwohl Totgesagte länger leben: Viele Leute kennen sich gut im CPAN aus und können so schnell erstaunliche Lösungen basten.
awk dagegen wirkt nun sehr alt, siehe z.B. die Diskussion hier:
The single greatest disadvantage to using AWK for serious work is that nobody but you and Dr. Loui does that so you get to invent everything for yourself every time.
I don't think anyone would seriously advocate using awk for complex projects these days,
awk hat diese Nische, offenbar ist es gerade im Umgang mit csv-Dateien (wie hier) einigermaßen mächtig. Aber es erscheint insgesamt doch sehr eingeschränkt.
http://de.wikipedia.org/wiki/Awk
Die Leistungsfähigkeit, Kompaktheit, aber auch die Beschränkungen der awk- und sed-Skripte regten Larry Wall zur Entwicklung der Sprache Perl an.
Genau wie Larry ziehe ich eine Allround-Sprache vor. Und das war immerhin schon 1986.
Insofern muß man sich fragen, ob man Leuten, die ein kleines Datenverarbeitungsproblem gelöst haben wollen und noch nie was von Skriptsprachen gehört haben, heute wirklich noch guten Gewissens sagen kann, sie sollten sich mit awk beschäftigen. Wie gesagt, das macht sonst nur noch Dr. Loui. ;)
 
Oben