Aus Raspberry Pi Geek 02/2018

Shell-Workshop, Teil 3 (Seite 4)

Darüber hinaus sehen Sie den Tausch eines Feldtrenners. Gerade beim Arbeiten mit CSV-Dateien und Skripten für Datenbanken erledigen Sie auf diese Weise viele Vorgänge. Als letzte Aufgabe löscht das Skript ein Zeichen.

Listing 12

 

#!/bin/bash
# Dezimaltrenner austauschen als Funktion.
# Punkt muss für Sed als Sonderzeichen
# entwertet werden.
dezimal () {
  a=$(echo $a | sed s'/\./,/g')
}
a=12.34
echo " Vor Funktion: $a"
dezimal
echo "Nach Funktion: $a"
echo "-"
# Feldtrenners gegen Tabulatoren tauschen
sed s'/\:/\t/g' Adressen.txt
echo -e "\n--"
# Löschen eines Zeichens, hier ":"
head -1 < Adressen.txt | sed s'/\://g'

Text sortieren

Gerade im Zusammenhang mit CSV-Dateien, Datenbanken und mit dem Befehl uniq, mit dem Sie mehrfach vorkommende, identische Zeilen filtern, benötigen Sie den Befehl sort: Er bringt das Ausgangsmaterial in einem ersten Schritt in eine geordnete Form. Die Tabelle “Sort-Optionen” zeigt einige der umfangreichen Möglichkeiten.

Sort-Optionen

Option

Aktion

-b

führende Leerzeichen ignorieren

-c

prüfen, ob Datei bereits sortiert ist

-f

Groß/Kleinschreibung ignorieren

-m

sortierte Dateien zusammenführen

-o Datei

Ergebnis in Datei umleiten

-r

in umgekehrter Reihenfolge sortieren

-n

numerisch sortieren

-t'Trenner'

Angabe des Feldtrenners

-u

mehrfach vorhandene Zeilen nur einmal ausgeben

Listing 13 zeigt drei Beispiel: Zunächst sortiert das Skript die Adressdatei alphanumerisch aufsteigend, anschließend rückwärts. Im dritten Beispiel sehen Sie, wie Sie bei strukturierten Textdateien eine Spalte angeben, die als Sortierkriterium dient. Dazu müssen Sie zusätzlich den Feldtrenner benennen.

Listing 13

 

#!/bin/bash
echo "Normal sortiert:"
sort < Adressen.txt
echo "--------------------"
echo "umgekehrt:"
sort -r < Adressen.txt
echo "--------------------"
echo "nach Nummer (Feld 6)"
sort -t':' -n -k6 < Adressen.txt
echo "--------------------"

Zeilen nummerieren

In einigen Fällen kann der Bedarf entstehen, die Zeilen von Textdateien zu nummerieren. Das erledigen Sie mittels nl. Die Tabelle “Nl: Optionen” führt die wichtigsten Optionen auf, Listing 14 zeigt einige Praxisbeispiele. Im Alltag versehen Sie damit vorsortierte Dateien mit eindeutigen Zeilennummern. Das hilft vor allem dann, wenn Sie über diverse Suchfunktionen gezielt einzelne Zeilen ansprechen müssen.

Nl: Optionen

Aktion

Option

Schalter

Numeriert gemäß [UMFANG]

-b[UMFANG]

a = alle Zeilen, t = nur Zeilen mit Inhalt, n = keine Zeilen

Numeriert mit [FORMAT]

-n[FORMAT]

ln = linksbündig, rn = rechtsbündig, rz = rechtsbündig, führende Nullen

Trennzeichen

-s[TRENNZEICHEN]

Startwert

-v[STARTWERT]

Inkrement

-i[INKREMENT]

Listing 14

 

#!/bin/bash
# Alle Zeilen nummerieren, auch Leerzeilen
# Standard: rechtsbündig (-nrn)
nl -ba < Adressen.txt
# Alle Zeilen linksbündig nummerieren
nl -ba -nln < Adressen.txt
# Alle Zeilen rechtsbündig nummerieren,
# führende Nullen, Trennzeichen = |
nl -ba -nrz -s'|' < Adressen.txt
# Alle Zeilen nummerieren,
# erste Zeile=10, Schrittweite = 20
nl -v10 -i20 < Adressen.txt

Identische Zeilen

Zusammen mit Sort setzen Sie das Kommando uniq ein, um doppelt vorhandene Zeilen zu erkennen und zu behandeln. Das Tool erwartet die mehrfach vorhandenen, identischen Zeilen stets direkt aufeinander folgend – daher die Kombination mit Sort. Die wichtigsten Optionen fasst die Tabelle “Uniq-Optionen” zusammen.

Uniq-Optionen

Aktion

Option

-c

Vorkommen zählen

-d/-D

nur mehrfach vorhandene Zeilen ausgeben

-u

nur einfach vorkommende Zeilen ausgeben

-i

Groß/Kleinschreibung ignorieren

-zZahl

nur Zahl Zeichen je Zeile vergleichen

Als Datensatz für die Beispiele dient die Datei einzigartig.txt, die Sie in Listing 15 sehen. Das Beispiel aus Listing 16 zeigt Ihnen verschiedene Abläufe. Interessant für die Praxis ist das Umkehren des Befehls, nämlich nur einfach vorhandene Zeilen auszugeben. Auch das Ignorieren der Groß- und Kleinschreibung erweist sich oft als hilfreich.

Listing 15

 

a
A
C
D

Listing 16

 

#!/bin/bash
# Aufruf ohne Sortierung
uniq < einzigartig.txt
echo "-------------"
# Vorsortierung, Schreibweise
# ignorieren, Vorkommen zählen
sort -f < einzigartig.txt | uniq -ic
echo "-------------"
# Ausgabe mehrfach vorhandener Zeilen
sort -f < einzigartig.txt | uniq -id
echo "-------------"
# Ausgabe einfach vorhandener Zeilen
sort -f < einzigartig.txt | uniq -iu

Zusammenfügen

Mit cat fügen Sie Textdateien seriell, also hintereinander zusammen. Wenn Sie dabei für die Dateinamen nur * angeben, erfolgt die Reihung in deren alphanumerischen Reihenfolge. Möchten Sie das Ergebnis in eine neue Datei schreiben, lenken Sie dazu die Ausgabe um.

$ cat DATEI1 DATEI2 .... > neu.txt
$ cat *.txt > neu.txt

Mit paste fügen Sie Dateien spaltenweise zusammen. Das setzt voraus, dass die Quelldateien dieselbe Länge haben. Bei Bedarf überprüfen Sie dies mit wc -l in einem Terminal. Anschließend sorgen Sie dafür, dass die Daten entsprechend sortiert sind. Die Eingabe paste -s Datei1Datei2 > neu.txt setzt die Dateien in der Form zusammen, dass jede Datei eine Spalte bildet.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben