UNIXwork

XNEdit Update 1.2.0

08. März 2020

Ich habe ein neues XNEdit-Release veröffentlicht. XNEdit ist mein Fork des Editors NEdit, da dieser nicht mehr weiterentwickelt wird, aber wichtige Features wie Unterstützung für Unicode fehlen.

XNEdit 1.2 bringt einige GUI-Verbesserungen, hauptsächlich im Umgang mit Encodings und dem Öffnen von Dateien. So können nun z.B. Dateien aus Dateimanagern wie Nautilus per Drag'n'Drop geöffnet werden.

Ein wichtiges neues Feature ist außerdem, dass nun bei Encoding-Fehlern recht unkompliziert die Datei mit einer anderen Encoding neugeladen werden kann. Außerdem wurde auch die Erkennung der Encoding verbessert.

Damit hat sich hoffentlich der Umgang in XNEdit mit unterschiedlichen kodierten Dateien drastisch verbessert. Da ich selber praktisch nur UTF-8 nutze und auch alte Dateien schon lange konvertiert habe, hatte ich das bisher nicht so auf dem Schirm, wie nervig das sein kann.

XNEdit auf Sourceforge

Autor: Olaf | 0 Kommentare | Tags: xnedit, x11, unix, linux

Datenanalyse in der Shell Teil 4: join

18. Dezember 2019

Mit dem Programm join können Daten aus zwei Dateien verknüpft werden. Dabei werden Zeilen mit gleichen Daten in einem bestimmten Feld zusammengefügt. Das Ganze funktioniert also ähnlich wie ein SQL-JOIN.

Ähnlich wie bei anderen Tools müssen die Daten bereits sortiert sein. Hierbei hilft wie immer sort. Außerdem arbeitet join auch mit Feldern, die durch ein Trennzeichen getrennt sind.

Ein kurzes Beispiel mit einfachen Testdaten. Datei1:

1 jan
2 feb
3 mar
5 may

Datei2:

1 31
2 28
3 31
4 30

Ein Join aus beiden Dateien:

$ join Datei1 Datei2
1 jan 31
2 feb 28
3 mar 31

Standardmäßig wird das Feld 1 aus beiden Dateien verglichen. Möglich ist auch, unterschiedliche Felder zu nehmen. Dafür gibt die es Optionen -1 <feldnummer>, um die Feldnummer für die erste Datei anzugeben. Für die zweite Datei gibt es die Option -2 <feldnummer>. Ebenso ist es möglich, statt Space ein anderes Trennzeichen mit der Option -t <char> anzugeben.

In der Ausgabe dürfte einem auffallen, dass Zeilen, die nicht verbunden werden können, nicht ausgegeben werden (INNER JOIN). Dies lässt sich mit den Optionen -a1 und -a2 ändern. Wenn -a1 angegeben ist, werden von der ersten Datei alle Zeilen ausgegeben, bei -a2 das gleiche für die zweite Datei. Es können auch beide Optionen benutzt werden.

Das war jetzt nur eine einfache 1:1-Beziehung. Mit join funktionieren aber auch 1:n-Beziehungen. Nehmen wir dafür ein paar neue Beispieldaten:

Datei1:

admin 1000 System Administrator
max 1001 Max Mustermann
john 1002 John Doe

Datei2:

max user     20 11. Dez 18:01 report.pdf
max user     12 11. Dez 17:56 calc.txt
admin admin  78  8. Dez 10:52 list.txt
john user    24 18. Dez 17:22 stuff1
john user    20 18. Dez 17:22 stuff2
max user     12 11. Dez 18:09 newfile1.txt
max user     10 11. Dez 18:09 todo.txt
admin admin 109  8. Dez 11:28 machines.txt
john user    58 25. Nov 07:26 names.txt
john user    42 25. Nov 07:27 states.txt
admin admin 152  7. Dez 17:42 table1
max user     25  8. Dez 10:12 testdata
max user     12 11. Dez 18:08 test.txt

Join:

$ join <(sort Datei1) <(sort Datei2)
admin 1000 System Administrator admin 109 8. Dez 11:28 machines.txt
admin 1000 System Administrator admin 152 7. Dez 17:42 table1
admin 1000 System Administrator admin 78 8. Dez 10:52 list.txt
john 1002 John Doe user 20 18. Dez 17:22 stuff2
john 1002 John Doe user 24 18. Dez 17:22 stuff1
john 1002 John Doe user 42 25. Nov 07:27 states.txt
john 1002 John Doe user 58 25. Nov 07:26 names.txt
max 1001 Max Mustermann user 10 11. Dez 18:09 todo.txt
max 1001 Max Mustermann user 12 11. Dez 17:56 calc.txt
max 1001 Max Mustermann user 12 11. Dez 18:08 test.txt
max 1001 Max Mustermann user 12 11. Dez 18:09 newfile1.txt
max 1001 Max Mustermann user 20 11. Dez 18:01 report.pdf
max 1001 Max Mustermann user 25 8. Dez 10:12 testdata

Funktioniert also auch hier wie in SQL. Da wir pro Zeile in Datei1 mehrere Zeilen in Datei2 haben, werden die Zeilen in Datei1 dupliziert.

Autor: Olaf | 0 Kommentare | Tags: shell, analytics, unix

Linkdump

14. Dezember 2019
Autor: Olaf | 0 Kommentare | Tags: links, bash, unix, analytics

Datenanalyse in der Shell Teil 3: Datei vergleichen

12. Dezember 2019

Mit dem Programm comm können Dateien miteinander verglichen werden. Das Programm prüft, ob Zeilen in Datei1, in Datei2 oder in beiden vorhanden sind. Die Daten müssen hierfür bereits sortiert sein. Falls dies nicht der Fall ist, hilft wieder sort.

Hier ein einfaches Beispiel zu comm:

$ cat > file1
1
2
3
a
b
c
$ cat > file2
0
1
b
c
d
$ comm file1 file2
    	0
            	1
2
3
a
            	b
            	c
    	d

Die Ausgabe enthält 3 Spalten:

Um die Ausgabe zu filtern, gibt es die Optionen -1 -2 und -3 um die jeweiligen Spalten bei der Ausgabe zu unterdrücken. Um z.B. nur die Spalte 3 auszugeben, muss -12 angegeben werden:

$ comm -12 file1 file2
1
b
c

Damit kann comm genutzt werden, um Schnittmengen oder Differenzmengen zu bilden.

Autor: Olaf | 0 Kommentare | Tags: shell, analytics, unix

Datenanalyse in der Shell Teil 2: Beispiele

11. Dezember 2019

In Teil 1 habe ich einige Unix-Tools für einfache Datenauswertungen vorgestellt. Dies möchte ich in diesem Artikel mit zwei Beispielen etwas vertiefen.

Dafür habe ich mir ein paar Testdaten von hier besorgt, und zwar die Datei airtravel.csv.

"Month", "1958", "1959", "1960"
"JAN",  340,  360,  417
"FEB",  318,  342,  391
"MAR",  362,  406,  419
"APR",  348,  396,  461
"MAY",  363,  420,  472
"JUN",  435,  472,  535
"JUL",  491,  548,  622
"AUG",  505,  559,  606
"SEP",  404,  463,  508
"OCT",  359,  407,  461
"NOV",  310,  362,  390
"DEC",  337,  405,  432

Diese Beispieldaten enthalten für drei Jahre die monatliche Anzahl an Flugreisenden.

Beispiel 1: Summe von Spalten bilden

Als erstes möchten wir die Gesamtsumme pro Jahr wissen, also die drei Spalten aufsummieren. Um die Daten leichter zu verarbeiten, entfernen wir die Tabellenüberschrift sowie die erste Spalte mit den Monatsbezeichnungen.

$ tail -12 airtravel.csv | cut -d ',' -f 2,3,4 > data1.csv
$ cat data1.csv
  340,  360,  417
  318,  342,  391
  362,  406,  419
  348,  396,  461
  363,  420,  472
  435,  472,  535
  491,  548,  622
  505,  559,  606
  404,  463,  508
  359,  407,  461
  310,  362,  390
  337,  405,  432

Wir summieren wir das jetzt? Hierfür benutzen wir das Programm bc, welcher ein Taschenrechner ist, der seine Eingabe von stdin lesen kann. Um eine vernünftige Eingabe für bc zu generieren, müssen wir alle Zeilen einer Spalte zu einer einzigen Zeile zusammenfügen, getrennt durch ein Plus für die Rechenoperation. Dies kann mit dem Tool paste erledigt werden, in dem die -s Option angegeben wird und mit -d ein Trennzeichen.

Zunächst einmal extrahieren wir mit cut eine Spalte und übergeben diese an paste. Dies liefert eine einzige Zeile mit unseren Zahlen, getrennt durch ein +, welche wir an bc übergeben können, um unsere Summe zu erhalten:

$ cut -d ',' -f 1 data1.csv | paste -s -d+ - | bc
4572

Beispiel 2: Maximum und Minimum finden

Als nächstes möchten wir rausfinden, in welchem Monat es im Jahr 1959 am meisten und am wenigsten Reisende gab. Hierfür schneiden wir wieder die Spaltenüberschriften weg. Danach sortieren wir die gewünschte Spalte und holen uns das Minimum und Maximum mit den Tools head und tail:

$ tail -12 airtravel.csv | cut -d ',' -f 1,3 | sort -t ',' -k 2 > col2_sorted.csv
$ cat col2_sorted.csv
"FEB",  342
"JAN",  360
"NOV",  362
"APR",  396
"DEC",  405
"MAR",  406
"OCT",  407
"MAY",  420
"SEP",  463
"JUN",  472
"JUL",  548
"AUG",  559
$ printf "min: %s\nmax: %s\n" "`head -1 col2_sorted.csv`" "`tail -1 col2_sorted.csv`"
min: "FEB",  342
max: "AUG",  559

Fazit: Einfache Aufgaben sind unproblematisch. Bei komplexeren Anforderungen könnte man aber schnell an die Grenzen stoßen. Das war aber noch nicht alles. Im nächsten Artikel warten weitere Werkzeuge auf uns.

Autor: Olaf | 1 Kommentare | Tags: shell, analytics, unix
Weiter