
In der Arbeit eines Datenwissenschaftlers muss ich meistens Daten von einer Ansicht in eine andere übertragen, aggregieren, zu derselben Granularität führen und die Daten bereinigen, laden, entladen, analysieren, formatieren und senden (die im Allgemeinen auch Daten in irgendeiner Form sind). Mit den Daten stimmt immer etwas nicht und sie müssen schnell hin und her gefahren werden - vor allem klassische Unix-Dienstprogramme und kleine, aber stolze Tools helfen mir dabei: Wir werden heute darüber sprechen.
Und heute wird es eine Auswahl mit Beispielen und Situationen geben, in denen ich sie verwenden muss. Alles, was hier und unten beschrieben wird, ist eine echte subjektive Erfahrung und natürlich für jeden anders, aber vielleicht ist es für jemanden nützlich.
Werkzeuge - lernen Sie die Werkzeuge - alles, was geschrieben wurde, ist subjektiv und basiert ausschließlich auf persönlichen Erfahrungen: Es hat mir geholfen, vielleicht hilft es Ihnen auch.
Bevor Sie anfangen zu lesen, erinnern wir Sie daran, dass wir jetzt unser Spiel für Kulkhacker spielen , in dem Sie Zeit haben können, Geld zu gewinnen ...
Zsh und oh-my-zsh - nach all den Jahren in Bash!
Soweit ich mich erinnere, war ich 17 Jahre alt und habe Linux installiert. Terminal und Bash. Und irgendwie war die Bash immer ein Teil des Prozesses und verkörperte für mich die eigentliche Arbeit im Terminal. 12 Jahre nach meiner Promotion landete ich in einer Firma, in der es ein Einführungsdokument gab, und zum ersten Mal stieß ich auf eine Mohnblume und beschloss, ihr zu folgen.
Und siehe da! Bequeme Ordnernavigation, automatische Vervollständigung von Menschen, Git-Anzeige, Themen, Plugins, Unterstützung für eine virtuelle Umgebung für Python usw. - jetzt sitze ich im Terminal und bin nicht überglücklich!

Wir setzen zsh, wie Sie normalerweise alles setzen, und gehen zu oh-my-zsh (in der Tat ist dies eine Folk-Zusammenstellung von Rezepten, die sofort funktionieren und Unterstützung für Plugins, Themen usw. hinzufügen). Sie können es hier nehmen . Sie können auch ein Thema einfügen (z. B.). Hier ist eine gute Demo der Möglichkeiten. Aus diesem Artikel hier entnommen .
Pipelines

Eines der besten Terminaldesigns ist die Pipeline. In einfachen Worten, es ermöglicht Ihnen, die Ausgaben eines Befehls mit den Eingaben eines anderen zu verbinden, ein einfaches Anwendungsbeispiel, das buchstäblich einer Aufgabe entnommen ist, die ich vor zwei Tagen ausgeführt habe.
Es war notwendig, ein Problem in einer Sprache zu simulieren, um kombinatorische Probleme zu lösen. Alles wurde vom Terminal aus gestartet und durch Platzieren eines einfachen Symbols in einer absolut unlesbaren Form aus dem Text angezeigt - angeschlossene Eingänge Ausgänge und Formatierungsunterstützung:
| python.py format.py
Eine interessantere und alltäglichere Aufgabe besteht darin, einige Parameter oder Merkmale aus den hochgeladenen Daten auszuwerten. In der Regel handelt es sich hierbei um eine Reihe von schnellen Überprüfungen, ob sich die erforderlichen Werte irgendwo auf dem Server mit den Daten gut verhalten. Beispielsweise möchten wir verstehen, was wir mit dem Parser und haben Sehen Sie, wie viele eindeutige Gruppen in allen JSON-Dateien gesammelt werden. Dieser Parameter sollte natürlich im Laufe der Zeit angemessen wachsen:
cat data/*groups* | jq .group | uniq | wc -l
Wir werden mehr über jeden von ihnen sprechen, aber die allgemeine Idee ist bereits klar:
- cat - (kurz für verketten) druckt den Inhalt von Dateien mit dem Wort "Gruppe" im Namen aus den Daten / Ordnern
- jq - reißt das Feld "Gruppe" von json heraus
- uniq - hinterlässt nur eindeutige Gruppen
- wc - mit dem Schalter -l werden die Zeilen gezählt, d. h. die Anzahl der Gruppen
Und jetzt schauen wir uns wc genauer an.
WC ist ein kleines, aber stolzes Dienstprogramm zum Zählen von Zeilen, Wörtern und mehr.
wc - kann mit einfachen Tasten schnell Wörter, Zeilen, Buchstaben, Bytes und die maximale Zeilenlänge lesen:
—bytes—chars—words—lines—max-line-length
Es scheint, dass dies trivial ist, aber es stellt sich als unglaublich oft notwendig und bequem heraus.
Lassen Sie uns im täglichen Gebrauch schnell abschätzen, wie viele Daten wir gesammelt haben (hier ist eine Zeile, ein Datensatz):

Weitere Details hier .
Ack / grep
Tausende von Handbüchern und Artikeln wurden darüber geschrieben, aber ich kann nicht anders, als zu erwähnen, dass sie den Text mit Stammgästen und ihrer eigenen Abfragesprache gemäß dem Muster herausreißen. Im Allgemeinen scheint mir ack benutzerfreundlicher und einfacher zu sein, daher wird es hier sein:
Beispiel: Finden Sie schnell das Vorkommen des Wortes (Schlüssel „-w“) ga2m (Modelltyp), ohne Berücksichtigung der Groß- und Kleinschreibung (Schlüssel -i) in Python-Quelldateien ::

JQ - parse json in der Kommandozeile
Dokumentation .
JQ ist geradezu grep / ack für json (wenn auch mit einem Hauch von sed und awk - über letzteres später) - tatsächlich ein einfacher Parser für json und json line in der Kommandozeile, aber manchmal ist es äußerst praktisch - irgendwie musste ich das Wikidata-Archiv analysieren im bz2-Format wiegt es ungefähr 100 GB und ungefähr 0,5 TB unkomprimiert.
Es war notwendig, eine Korrespondenz zwischen mehreren Feldern daraus herauszureißen, was sich als sehr einfach auf einem Computer herausstellte, auf dem CPU und Speicher praktisch nicht belastet waren. Hier ist genau der Befehl, den ich verwendet habe:
bzcat data/latest-all.json.bz2 | jq —stream 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' | python3 scripts/post_process.py "output.csv"
Es war im Wesentlichen die gesamte Pipeline, die das erforderliche Mapping erstellt hat, da wir sehen, dass alles im Stream-Modus funktioniert hat:
- bzcat las einen Teil des Archivs und gab jq
- jq mit dem Schlüssel -stream erzeugte sofort das Ergebnis und übergab es an den Postprozessor (genau wie beim allerersten Beispiel) in Python
- Intern ist ein Postprozessor eine einfache Zustandsmaschine
Insgesamt eine komplexe Pipeline, die im Stream-Modus mit Big Data (0,5 TB) ohne nennenswerte Ressourcen arbeitet und aus einer einfachen Pipeline und einigen Tools besteht. Ich würde auf jeden Fall empfehlen, nach Belieben auszuchecken.
fzf - Fuzzy Finder
Das Praktischste (besonders in einem WIM): Schnelles Durchsuchen von Dateien, was für ein großes Projekt praktisch ist - insbesondere, wenn Sie mehrere davon haben. In der Regel müssen Sie in einem großen Projekt schnell nach Dateien nach einem bestimmten Wort suchen: Ich war in ein neues Projekt vertieft, das mehrere große Repositorys enthält, und als Einführungsaufgabe musste ich dem im System verfügbaren Bereich ein einfaches Modell hinzufügen, und ich musste es schnell tun Finden Sie Ihre Dateien mit dem Schlüsselwort ga2m und arbeiten Sie analog mit anderen "Codeblöcken" - bearbeiten Sie schnell den einen oder anderen - hier kommt fzf sehr gut zur Rettung:

Link zum Repository .
AWK
Der Name stammt aus den Anfangsbuchstaben der Schöpfer von Aho, Weinberger und Kernighan: Eine Skriptsprache für die Verarbeitung von Texttabellendaten - sie wendet Transformationsmuster auf jede Zeile der Datei an. In der
Regel ist sie ideal für schnelle einmalige Transformationen. Beispielsweise haben wir einen Datensatz in Form von tsv von Hand zusammenstellen lassen und der Prozessor erhielt jsonl als Eingabe und erwartete ein zusätzliches "Thema" -Feld, das sich nicht in der Quelldatei befand (erforderlich für einige Dinge, die für die aktuellen Berechnungen nicht kritisch waren) - insgesamt wurde eine einfache einzeilige Zeile geschrieben:
cat groups.tsv | awk '{ printf "{\"group\": \"%s\", \"theme\": \"manual\" }\n", $1 }' > group.jsonl
Tatsächlich nahm er eine Datei und wickelte jede Zeile in json mit den erforderlichen Feldern ein.
Link vom Tutorial .
wget - vielseitiger Befehlszeilen-Downloader
Regelmäßig müssen Skripte und Pipelines etwas von irgendwoher aufrufen und herunterladen - und wget schlägt nicht fehl: Es kann herunterladen, sich anmelden, Proxys, Cookies und neben http (s) auch FTP ausführen.
Schweizer Messer im Download.
HSTR - Suchbefehlsverlauf mit menschlichem Gesicht
Befehlsverlauf: hstr
Ich muss regelmäßig nach etwas im Befehlsverlauf suchen:
- "Ich musste es schon tun"
- "Mit welchen Tasten beginnt X?"
- "Aber dieses Stück kann wiederverwendet werden"
Daher ist es für mich sehr wichtig, eine gute und bequeme Suche im Befehlsverlauf zu haben, während hstr seine Arbeit vollständig erledigt:
Nützlich, aber nicht enthalten
Abschließend möchte ich erwähnen, dass es nützlich ist, einen separaten Artikel des Themas zu lesen:
- Ssh + tmux + vim (Neo, Plugins usw.)
- Grundkenntnisse in Kommandozeilen-Git + Git-Hooks
- Data pipeline construction make/just
- Python virtual environments
- Docker
