Filtern und Ändern von Daten in X X-Dateien (separated value, xSV)

Problem

Sie müssen Daten in durch Kommas getrennten Wertdateien (CSV) filtern und ändern. Oder eine der vielen CSV-Dateivarianten: Tab separate value(TSV)-Dateien, Dash separate value(DSV)-Dateien oder Ausrufezeichen getrennte Value(ESV)-Dateien.

Lösung

Verwenden Sie die Unix/Linux-Utilties awk,  sed,  head,  tail  und  sort.

Wie es funktioniert

Ein gängiger Ansatz zum Verteilen von Datendateien, die Text enthalten, ist die Verwendung von Sonderzeichentrennzeichen. Einer der ältesten Zeichentrennzeichenisten ist die Verwendung von Kommas (z. B. <field1>,<field2>,<field3>), Dateien, die als kommasgetrennter Wert (CSV) bezeichnet werden. So beliebt die CSV-Dateiverteilung auch ist, auch andere Sonderzeichentrennzeichen sind entstanden, um Datendateien zu verteilen, die aus Text bestehen. Zu diesen weiteren Separatoren gehören: Bindestriche(-), vertikale Balken(| ), tabs( ) — unsichtbar für das bloße Auge, aber eindeutig für ein digitales System — und sogar Ausrufezeichen(! ).

Im Allgemeinen hängt die Wahl des Sonderzeichentrennzeichens von einer Reihe von Faktoren ab, die von den Präferenzen des Datenautors über den Typ des Programms für das Hosten der Originaldaten (z. B. viele Programme bieten die Möglichkeit, Daten als CSV-Dateien zu exportieren) bis hin zur Art der exportierten Daten reichen (z. B. wenn die Daten selbst Kommas haben, um Ihre Bedeutung auszudrücken, indem Sie Kommas verwenden, um Felder zu trennen, um zukünftige Verarbeitungsaufgaben zu unterteilen).

Angesichts dieser umfangreichen Möglichkeiten für Sonderzeichentrennzeichen verwende ich in den folgenden Abschnitten den Begriff xSV, wobei  x für ein Komma, binich, eine vertikale Leiste, eine Registerkarte, ein Ausrufezeichen oder ein anderes Sonderzeichen stehen kann. Die folgenden Techniken werden speziell geschrieben, sodass die zugrunde liegende Logik für jedes Sonderzeichen, das zum Trennen der Werte in einer aus Text bestehenden Datendatei verwendet wird, leicht wiederverwendbar ist.

Dateien, Datensätze, Felder und Trennzeichen
In den kommenden Abschnitten werden die Begriffe Dateien, Datensätze, Felder und Trennzeichen ausgiebig verwendet. In der folgenden Zeichnung erfahren Sie, was sich bei jedem dieser Begriffe im Kontext einer xSV-Datei befindet.

 

Datei (Alle Daten)

————————————————————

| Feld1 [Separator] Feld2 [Separator] Feld3 [Separator] |  (<- Datensatz 1 – Alle Felder in der Zeile)

| Feld1 [Separator] Feld2 [Separator] Feld3 [Separator] |  (<- Datensatz 2 – Alle Felder in der Zeile)

| Feld1 [Separator] Feld2 [Separator] Feld3 [Separator] |  (<- Datensatz 3 – Alle Felder in der Zeile)

| Feld1 [Separator] Feld2 [Separator] Feld3 [Separator] |  (<- Datensatz 4 – Alle Felder in der Zeile)

———————————————————–

 

Filterfelder, Feldreihenfolge ändern und Feldtrennzeichen in X  X-Dateien (separated value) ändern

Um die Menge an Informationen in Big Data-Dateien zu reduzieren, besteht ein üblicher Vorgang darin, seine Felder zu filtern. Durch das Filtern unnötiger Felder in Big Data-Dateien reduzieren Sie deren Größe, was auch reduzierte Übertragungs- und Verarbeitungszeiten bedeutet. Obwohl es viele Tools zum Filtern von Feldern in Big Data-Dateien gibt, beschränke ich mich auf die einfachsten Tools, die im vorherigen Rezept beschrieben wurden. Liste 1 veranschaulicht die Verwendung von awk zum Filtern von Feldern in einer Datei aus einer Unix/Linux-Befehlszeile.

Auflistung 1 – Filtern von Feldern in einer CSV-Datei mithilfe von awk und einer Unix/Linux-Befehlszeile

awk -F“,“ “Druck “““““““AviationData.csv > Filtered_AviationData_threefields.csv“

Die Eingabedatei, die einer awk-Aufgabe übergeben wird, ist zuletzt. In diesem Fall ist die Eingabedatei  AviationData.csv, wobei als Ausschnitt  > Filtered_AviationData_threefields.csv  der Ausgabespeicherort für das Ergebnis der  awk-Aufgabe  darstellt. Das  Symbol > stellt die Standardumleitung unter Unix/Linux dar (d.h. senden Sie alle daten, die links von  >  — in diesem Fall der  awk-Aufgabe  — rechts von  > — erzeugt wurden, in diesem Fall die Datei  Filtered_AviationData_threefields.csv). Wenn der Ausschnitt  > Filtered_AviationData_threefields.csv  weggelassen würde, würden die Ergebnisse der awk-Aufgaben  direkt an die Befehlszeile gesendet und Sie würden sie einfach blinken sehen, um die Ergebnisse für die spätere Verwendung zu speichern, werden sie mit dem beschriebenen Ausschnitt an eine Datei gesendet.

awk arbeitet rekursiv auf allen Zeilen einer Datei, was bedeutet, dass eine  awk-Anweisung auf jeden Datensatz einer Datei angewendet wird. Um einen neuen Datensatz zu erstellen,  tritt ein neuer Datensatz nach einer Zeilenumbruch- oder EOL-Marker (End-of-Line) auf, die der Standard für das Trennen von Datensätzen in  X-Dateien (separated value, xSV) ist. X

Der awk-Befehl  selbst besteht aus zwei Anweisungen. -F“,“,  um das Feldtrennzeichen anzugeben, bei dem jeder Datensatz aufgeteilt werden soll, der in awk eingespeist wird, und  um das erste, 2. & 3. Feld auszugeben, das dem geteilten Feldtrennzeichen entspricht. Wenn eine Datei beispielsweise Datensätze in der Form  20120502X14109,Accident,ERA12LA315,05/02/2012,Columbus.GA,United States  die  awk-Aufgabe  auflistet 1 Ausgänge den Datensatz als  20120502X14109,Unfall,ERA12LA315.

Wenn Sie die Felder city.state und country herausfiltern wollten — Columbus.GA,Vereinigte Staaten  — dann müsste der zweite Teil des awk  “print ““““ sein, da die Felder city.state und country die 5. und 6. Position darstellen, nachdem der geteilte Feldtrenner, in diesem Fall ein  ,(Komma) abgleichen. Wenn Sie den Feldauftrag ändern möchten, ändern Sie den zweiten Teil des awk-Vorgangs, um die gewünschte Reihenfolge   widerzuspiegeln. Um z. B. das zweite Feld als erstes Feld erscheinen zu lassen, verwenden Sie eine Anweisung wie die folgende:  ‚{print $2,$1,$3}‘.

Falls die Felder einer Datei durch etwas anderes als ein, (Komma) getrennt sind,können Sie den Parameter -F von  awkändern, um ein anderes Trennzeichen anzugeben, wie in Liste 2 dargestellt.

Eintrag 2 – Filtern von Feldern in einer xSV-Datei mithilfe von awk und einer Unix/Linux-Befehlszeile

• Vertikale Balken getrennte Datei teilen

awk -F“|“ AviationData.vsv > Filtered_AviationData_threefields.vsv

• Geteilte Tab-datei

awk -F“-t“ “druck ““““““AviationData.tsv > Filtered_AviationData_threefields.tsv“

• Split-Ausrufezeichen getrennte Datei

awk -F“-!“ AviationData.esv > Filtered_AviationData_threefields.esv

In Liste 2 können Sie die Verwendung eines vertikalen Balkentrennzeichens, eines Tab-Trennzeichens und eines Ausrufezeichens sehen. Beachten Sie, dass die Syntax des Ausrufezeichentrennzeichens einen umgekehrten Schrägstrich verwendet. zum Entkommen  ! und für das Tab-Trennzeichen-Beispiel wird die Syntax verwendet,  die die Standardtextdarstellung für Registerkarten ist, das andere Beispieltrennzeichen für  | verwendet das Trennzeichen wörtlich.

Wenn Sie die Ausgabe für eine der vorherigen awk-Aufgaben überprüfen, werden Sie feststellen, dass die Ausgabe zwar Felder effektiv aus der Originaldatei herausgefiltert hat, aber das ursprüngliche Trennzeichen fehlt. Standardmäßig fügt awk ein Leerzeichen ein, wenn Felder explizit gedruckt werden, wie im Fall von “print ““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““‘      Aber keine Sorge, das Hinzufügen eines Trennzeichens zur awk-Ausgabe ist einfach, wie in Auflistung 3 dargestellt.

Listing 3 – Hinzufügen/Ändern von Feldtrennzeichen der Ausgabe in awk-Aufgaben

• Komma als Trennzeichen hinzufügen (als Originalkomma)

awk -F“,“ “OFS=““““““““““““AviationData.csv > Filtered_AviationData_threefields.csv“

• Vertikale Leiste als Trennzeichen hinzufügen (als originaler vertikaler Balken)

awk -F“|“ “OFS=“|““ AviationData.vsv > Filtered_AviationData_threefields.vsv

• Tab als Trennzeichen hinzufügen (geändert von ,)

awk -F“,“ “OFS=““““““Filtered_AviationData_threefields““““““““““““““““““““““““““““““““““““““““““““““““

Das Anfügen des Snippets  „OFS=“, „“ an den Awk-Druckbefehl   trennt die Ausgabefelder mit dem angegebenen Feldtrennzeichen. OFS steht für ‚Output Field Separator‘, also gibt   awk an, die Ausgabefelder mit einem zu  trennen. Diese Syntax macht die Auswahl des Ausgabetrennzeichens sehr vielseitig, wo Sie das gleiche Trennzeichen wie die Originaldatei angeben oder sogar den Trennwert von der Originaldatei ändern können (z. B. ändern Sie das Trennzeichen von  ,(Komma) in eine Registerkarte ( )).

Ändern von Zeichensequenzen für Datensätze und Felder in X  X-Dateien mit getrenntem Wert (xSV)

Neben dem Filtern von Feldern, dem Ändern der Feldreihenfolge und dem Ändern von Feldtrennzeichen für Datendateien, die durch Sonderzeichen getrennt sind, besteht eine weitere häufige Aufgabe darin, Zeichensequenzen in Datensätzen und Feldern zu ändern. Dies kann der Fall sein, wenn ein Feld zu lang ist, aber dennoch wichtige Daten enthält, die Sie nicht vollständig entfernen möchten, ein Datensatz vertrauliche Datenzeichen enthält, die maskiert werden müssen, oder es zusätzliche Daten gibt, die einem Datensatz hinzugefügt werden müssen.

Um Zeichensequenzen mit awk zuändern, verwenden wir reguläre Ausdrücke. Im Kontext von  awk  werden reguläre Ausdrücke auch rekursiv auf jeden Datensatz angewendet — wie alle  awk-Aufgaben  — aber es gibt kein Konzept von Feldtrennzeichen wie den vorherigen Beispielen. Inliste 4 veranschaulicht eine Reihe von  awk-Aufgaben  mit regulären Ausdrücken.

Auflistung 4 – Ändern von Zeichensequenzen in einer xSV-Datei mithilfe von awk in einer Unix/Linux-Befehlszeile

• Ersetzt die 1. Instanz von ‚2‘ durch ‚***‘ in einem Datensatz

awk “sub(//2/,“***“);print“ AviationData.csv > Filtered_AviationData_firsttwo.csv

• Ersetzt die 4. Instanz von ‚2‘ durch ‚***‘ in einem Datensatz

gawk “““““““““““““““““““““““““““““““““’Filtered_AviationData_fourthtwo ;p“““““““““““““““““““““““““

• Ersetzt alle Instanzen von ‚2‘ für ‚***‘ in einem Datensatz

awk “’gsub(///////’***“);print“ AviationData.csv > Filtered_AviationData_alltwos.csv

Da es kein Konzept für Feldtrennzeichen gibt, beachten Sie das Fehlen der F-  und  OFS-Parameter  in Der Auflistung 4 im Vergleich zu früheren Angeboten. Die Anweisung  sub(/2/,“***“) weist awk  an, das Vorkommen von 2 auf jedem Datensatz durch die Zeichen  *** zu ersetzen.  Die  print  druck-Anweisung gibt an, dass der gesamte Datensatz — unabhängig von der Anzahl der Felder — nach dem Ersetzungsvorgang ausgegeben wird. Sobald die vorherigen Anweisungen ausgeführt wurden, können Sie die gleiche Syntax wie vorherige  awk-Aufgaben  verwenden sehen: die Eingabedatendatei  AviationData.csv wird zuletzt angegeben und die Ergebnisse werden mit dem Operator >  in eine andere Datei umgeleitet.

Die Syntax für die sub()-Methode  ist einfach. Der erste Parameter ist ein regulärer Ausdruck — in diesem Fall  /2/, um dem Zeichen  2 zu entsprechen — wobei, wie der zweite Parameter angibt, die Ersetzungszeichen für den Fall, dass der reguläre Ausdruck auf einem Datensatz abgeglichen wird. Wenn der reguläre Ausdruck nicht mit einem Datensatz übereinstimmt, wird der Datensatz ohne Änderungen übergeben. Ein weiteres Merkmal der  Submethode  besteht darin, dass sie nur das erste Vorkommen des übereinstimmenden regulären Ausdrucks ersetzt (z. B. würde ein Datensatz wie „3299-3323-9282“ in „3***99-3323-9282“ geändert).

Um ein bestimmtes Vorkommen eines regulären Ausdrucks zu ändern, veranschaulicht die Auflistung 4 auch die Verwendung der gensub-Methode.  Die Syntax für die  gensub-Methode  ähnelt der  Submethode, mit der Ausnahme, dass eine Position für das Vorkommen regulärer Ausdrücke als letzter Parameter übergeben wird. Beispielsweise gibt die Angabe von 4 als letzter Parameter der gensub-Methode  an, das vierte Vorkommen des regulären Ausdrucks zu ersetzen (z. B. würde ein Datensatz wie ‚3299-3323-9282‘ in ‚3299-3323-928***“ geändert). Es ist auch erwähnenswert, dass die  gensub-Methode nur im dienstprogramm gawk  verfügbar ist,  das die GNU-Version von awk ist — obwohl Sie sich keine Sorgen über  gawk-  und  awk-Unterschiede  machen, sie funktionieren sehr ähnlich und beide sind frei verfügbar unter Unix/Linux OS.

Wenn Sie alle Vorkommen eines regulären Ausdrucks in einem Datensatz ändern möchten, verwenden Sie schließlich die gsub-Methode.  Die  gsub-Methode  hat die gleiche Syntax wie die  Sub-Methode, wobei der erste Parameter der reguläre Ausdruck und der zweite Parameter die Ersetzungszeichenfolge ist.

Obwohl Inliste 4 die einfachsten Ansätze zum Ändern von Zeichensequenzen mithilfe von awkveranschaulicht, können Sie auch komplexere Regeln in  awk anwenden, um Änderungen mithilfe regulärer Ausdrücke durchzuführen. Einige dieser Aktionen umfassen Conditionals und das Gruppieren mehrerer awk-Aufgaben, wie in Auflistung 5 dargestellt.

Auflistung 5 – Ändern von Zeichensequenzen in einer xSV-Datei mithilfe von awk in einer Unix/Linux-Befehlszeile

• Fügen Sie 3 Leerzeichen am Anfang jedes Datensatzes ein

awk “sub(/’/‘, “ „);print“ AviationData.csv > Filtered_AviationData_blankspacestart.csv

• Ersetzen Sie „2“ durch „***“ nur für Datensätze, die „California“ enthalten

awk ‚/California/’gsub(//2/, „***“);; AviationData.csv > Filtered_AviationData_conditional.csv

• Ersetzen Sie „2“ durch „***“ mit Ausnahme von Datensätzen, die „Florida“% enthalten

awk ‚!/Florida/-gsub(//2/, „***“); AviationData.csv > Filtered_AviationData_conditional_negated.csv

• Ändern Sie „Unfall“ oder „Wrack“ oder „Ruin“ in „Crash“

Rawk “gsub(/Unfall| Wrack | Ruine/, „Crash“); aviationData.csv > Filtered_AviationData_multiple_replacement.csv

• Fügen Sie 3 Leerzeichen beim Betteln jedes Datensatzes hinzu und geben Sie das erste, zweite und dritte Feld aus, das durch getrennt ist,

awk “sub(/’/,“““;print“ AviationData.csv | awk -F“,“ “OFS=““““““““““““““““““““““““““““““““““““““““’Filtered_AviationData_twotasks_piped““““‘

• Verkettete awk-Aufgaben, identisches Ergebnis wie vorherige Aufgaben

awk -F“,“ “OFS=“““““sub(//’/,“;p““““““““’AviationData.csv“““““““““““““““““““““““““““Filtered_AviationData_twotasks_concatenated““““““““““““““““““““““““‘

Die erste awk-Aufgabe  in Der Liste 5 verwendet den regulären Ausdruck  //, um eine Übereinstimmung für den Anfang einer Zeile anzugeben und durch 3 Leerzeichen zu ersetzen — im Wesentlichen fügt sie Platz am Anfang jedes Datensatzes in einer Datei hinzu. Die zweite und dritte Aufgabe sind identisch mit denen in der Auflistung 4 — mit der  gsub-Methode  — außer die Aufgaben haben einen bedingten regulären Ausdruck, um die Ausführung zu bestimmen. Das Anfügen von  /California/  an die  gsub-Methode  gibt an, dass die Ausführung nur für Datensätze erfolgen sollte, die den Text  Californiaenthalten. Wobei als Anfügen von  !/Florida/  an die  gsub-Methode  angegeben ist, dass die Ausführung für Datensätze erfolgen sollte, die nicht die  Floridaenthalten. Beachten Sie, dass es nichts  awk  spezifischeüber die Verwendung der Syntax  /California/  oder  !/Floridagibt, da dies eine Syntax für reguläre Ausdrücke ist, sodass Sie jeden regulären Ausdruck einfügen können, den Sie für notwendig erachten, um eine Ersetzungsaktion mit der  gsub-Methode  auszuführen.

Die vierte awk-Aufgabe  verwendet einen bedingten regulären Ausdruck mit der  gsub-Methode.  Die Syntax des regulären Ausdrucks  /Accident| Wrack | Ruine/ zeigt, um Unfall  oder  Wrack  oder  Ruine  (d.h.  |   stehen für  oder  in regulären Ausdrücken). Der zweite Parameter von  gsub  gibt an, dass alle Übereinstimmungen mit regulären Ausdrücken durch  Absturzersetzt werdensollen. Der Rest der  awk-Aufgabe  ist identisch mit den vorherigen, druckt jede Zeile nach der Ersetzung aus, erhält seine Eingabe aus einer csv-Datei und leitet die transformierte Ausgabe mithilfe des Operators > in eine andere Datei um.

Die fünfte awk-Aufgabe  stellt zwei verkettete Aufgaben dar. Der erste Teil  awk “sub(/’/,“ „“;print“ AviationData.csv, deklariert einen regulären Ausdruck, der dem Anfang einer Zeile  entspricht,  und ersetzt ihn durch drei Leerzeichen für jede der Zeilen in der Datei  AviationData.csv  — im Wesentlichen wird jede Zeile aufgepolstert. Die Ausgabe dieser ersten awk-Aufgabe wird mithilfe eines Unix-Pipe-Operators, der durch den  | Charakter. Der zweite awk-Task definiert ein Feldtrennzeichen mit  -F“,“, Ausgabefeldtrennzeichen mit  OFS=“,sowie eine Druckanweisung für die ersten drei Felder mit der Syntax .  Beachten Sie, dass die zweite Aufgabe ihre Ausgabe mithilfe des Operators > an eine Datei sendet und keine explizite Eingabedatei hat — da die Eingabe von der ersten awk-Aufgabe stammt, die über die Unix-Pipe empfangen wurde  | .

Schließlich führt die sechste awk-Aufgabe  das gleiche Ergebnis wie die fünfte  awk-Aufgabe.  Der Unterschied besteht darin, dass die sechste Aufgabe alles in einer einzelnen  awk-Anweisung verkettet, wobei als fünfte Aufgabe die awk-Aufgaben  getrennt und jede Anweisung mithilfe von Unix-Pipes verkettet. Für eine höhere Lesbarkeit und einfachere Tests ist das Verstellen einzelner awk-Aufgaben  mithilfe von Unix-Pipes häufig der bevorzugte Ansatz für eine große  awk-Anweisung, obwohl beide Ansätze gleichermaßen gültig sind und die gleichen Ergebnisse liefern.

Zusätzlich zu awkgibt es ein weiteres Dienstprogramm namens  sed  — für ‚Stream Editor‘ — das auch die Zeichensequenz für Datensätze und Felder ändern kann. Die Syntax, die von  sed verwendet wird, ist etwas anders, kann aber auch die gleichen Ergebnisse erzielen. Listing 6 zeigt eine Reihe von  Sed-Aufgaben  ähnlich denen in den Listen 4 & 5, die  awkverwenden, auf diese Weise können Sie selbst entscheiden, mit welchem Dienstprogramm Sie sich für das Ändern von Zeichensequenzen wohler fühlen.

Auflistung 6 – Ändern von Zeichensequenzen in einer xSV-Datei mit sed in einer Unix/Linux-Befehlszeile

• Ersetzt die 1. Instanz von ‚2‘ durch ‚***‘ in einem Datensatz

sed -e ’s/2/***/‘ AviationData.csv > Filtered_AviationData_firsttwo.csv

• Ersetzt die 4. Instanz von ‚2‘ durch ‚***‘ in einem Datensatz

sed -e ’s/2/***/4′ AviationData.csv > Filtered_AviationData_fourthtwo.csv

• Ersetzt alle Instanzen von ‚2‘ für ‚***‘ in einem Datensatz

sed -e ’s/2/***/g‘ AviationData.csv > Filtered_AviationData_alltwos.csv

• Fügen Sie ‚ **REVIEWED‘ String am Ende jeder Zeile hinzu

sed -e es/*REVIEWED/‘ AviationData.csv > Filtered_AviationData_addreviewed_endofline.csv

• Ersetzen Sie „2“ durch „***“ nur für Datensätze, die „California“ enthalten

sed -e ‚/California/s/2/***/‘ AviationData.csv > Filtered_AviationData_conditional_california.csv

• Ersetzen Sie „2“ durch „***“ mit Ausnahme von Datensätzen, die „Florida“ enthalten

sed -e ‚/Florida/!s/2/***/‘ AviationData.csv > Filtered_AviationData_conditional_noflorida.csv

• Ändern Sie „Unfall“ oder „Wrack“ oder „Ruin“ in „Crash“

sed -e ’s/Unfall/Crash/‘ AviationData.csv | sed -e ’s/Wreck/Crash/‘ | sed -e ’s/Ruin/Crash/‘ > Filtered_AviationData_multiple_replacement.csv

• Entfernen Sie das erste Feld für jeden Datensatz

sed -e ’s/'[‚,]*,*’AviationData.csv > Filtered_AviationData_remove_firstfield.csv

• Entfernen Sie das letzte Feld für jeden Datensatz

sed -e ’s/'(.*‘),.*/’1/‘ AviationData.csv > Filtered_AviationData_remove_lastfield.csv

Eine sed-Task  gibt einen  Sed-Ausdruck nach dem  -e-Flag  an, dem unmittelbar eine Dateneingabedatei folgt, auf die der Sed-Ausdruck angewendet werden soll. Darüber hinaus wird standardmäßig die Ausgabe einer sed-Aufgabe  an die Standardausgabe (d. h. Bildschirmklemme) gesendet, auf der die  sed-Aufgabe  ausgeführt wird, weshalb alle Aufgaben in Auflistung 6 den  Operator > nutzen, um die Ausgabe in eine separate Datei umzuleiten.

Einer der gebräuchlicheren Sed-Ausdrücke zum Ändern von Zeichensequenzen ist der Ersetzungsvorgang, der eine Syntax s/<regular_expression>/<replacement_string>/<occurrence>aufweist. Der sed-Ausdruck  ’s/2/***/‘  gibt an, dass das erste Vorkommen von  2 auf einem Datensatz durch die  ***-Zeichenfolge ersetzt wird. Wenn Sie den Ersetzungsvorgang auf ein bestimmtes Vorkommen des regulären Ausdrucks in einem Datensatz anwenden möchten — in diesem Fall  /2/  — dann würden Sie die Position am Ende angeben, so dass ’s/2/***/4′ angibt, das 4. Vorkommen von  2 in einem Datensatz durch die  *** Zeichenfolge zu ersetzen. Wenn Sie alle Vorkommen eines regulären Ausdrucks ersetzen möchten, verwenden Sie den Buchstaben  g am Ende des awk-Ausdrucks (z. B.’s/2/***/g‘). Und eine weitere einfache Variation eines regulären Ausdrucks als Sed-Ausdruck ist  ’s/’/ **REVIEWED/‘, was angibt, das Ende einer Zeile zu ersetzen — dargestellt durch den regulären Ausdruck  /’/  — durch die  **REVIEWED-Zeichenfolge.

Bedingte Ersetzung ist auch für Sed-Aufgaben  verfügbar. Der sed-Ausdruck ‚/California/s/2/***/‘ gibt beispielsweise an, den Substitutionsausdruck  s/2/***/ nur auf die Datensätze anzuwenden, die dem regulären Ausdruck  /California/entsprechen. Wobei der Sed-Ausdruck  ‚/Florida/!s/2/***/‘  angibt, den Substitutionsausdruck  s/2/***/ auf jeden Datensatz anzuwenden, mit Ausnahme des Übereinstimmens, der das Wort  Florida enthält — die  ! stellt einen Negationsausdruck dar.

Es ist auch möglich, Sed-Aufgaben  mit einem Unix-Rohroperator zu verketten, der durch den | Charakter. So die Reihe von Aufgaben  sed -e ’s/Accident/Crash/‘ AviationData.csv | sed -e ’s/Wreck/Crash/‘ | sed -e ’s/Ruin/Crash/‘, in der ersten Aufgabe wird der Begriff  Unfall durch Crash unter der Eingabe der Datei  AviationData.csv ersetzt, in der zweiten Aufgabe wird der Begriff Wrack durch Crash  ersetzt,  der als Eingabe der Ausgabe der ersten Sed-Aufgabe. wobei wie in der dritten Aufgabe der Begriff  Ruin durch Absturz  ersetzt wird,  der die Ausgabe der zweiten Sed-Aufgabe als Eingabe eingibt.

Der zweite bis letzte Sed-Ausdruck ’s/'[‚,]*,*‘  stellt einen regulären Ausdruck dar, der dem ersten Feld entspricht und es entfernt. Das erste  ,  gibt an, dass es mit dem Anfang einer Zeile übereinstimmt. [a,]  wird als Zeichenklasse bezeichnet, bei der das  ,  als negativeÜbereinstimmung verwendet wird (d. h. keine Kommas). Das  *  gibt an, dass 0 oder mehr Zeichen aus dem vorhergehenden Muster (d. h. 0 oder mehr Zeichen, die keine Kommas sind) bis zum rechten Muster, das ein , ist, übereinstimmen.  , Die letzten Schrägstriche  /  geben an, die Übereinstimmung durch eine leere Zeichenfolge zu ersetzen.

Schließlich verwendet der letzte Sed-Ausdruck in Auflistung 6 Gruppen und Verweise aus regulären Ausdrücken. Der erste Teil des Sed-Ausdrucks ’s/'(.*‘),.*/’1/“  fängt alles nach dem Anfang eines Datensatzes unter Verwendung der Syntax  ‚(.*‘), bis das letzte Komma — die umgekehrten Schrägstriche verwendet werden, um eine Ausdrucksgruppe anzugeben und nicht buchstäblich zu entsprechen ( ).  Nach der Ausdrucksgruppe werden alle anderen Zeichen nach dem letzten Komma mit  .*abgeglichen. Da die Ausdrucksgruppendaten abgefangen werden, kann sie durch eine Zahl im Ersetzungsteil der Aufgabe referenziert werden, dies ist die Bedeutung von  /’1/, die angibt, den regulären Ausdruck durch die Daten zu ersetzen, die in der ersten Ausdrucksgruppe gefangen sind (d. h. alles im Datensatz, der zum Komma führt) — der umgekehrte Schrägstrich wird verwendet, um anzugeben, dass die Ersetzung auf eine Ausdrucksgruppe verweist und nicht auf ein Literal  1.

Filtern von Datensätzen für X  X-Dateien (separated value, xSV)

Oft ist es notwendig, ganze Datensätze in einem einzigen Schritt zu filtern. Auch wenn ein Dienstprogramm wie awk  rekursiv über alle Datensätze in einer Datei arbeitet, kann die Verwendung von awk  zeitaufwändig und unzureichend sein, um auf einer so detaillierten Ebene zu arbeiten, wenn Sie ganze Datensätze filtern möchten. Zum Filtern ganzer Datensätze ist es am einfachsten,  sedzuverwenden. Liste 7 veranschaulicht eine Reihe von Aufgaben, die sed  verwenden, um ganze Datensätze zu filtern.

Auflisten 7 – Filtern von Datensätzen in einer xSV-Datei mit sed in einer Unix/Linux-Befehlszeile

• Filtern Sie den ersten Datensatz in der Datei

sed -e ‚1d‘ AviationData.csv > Filtered_AviationData_noheader.csv

• Filterdatensätze 1 bis 10 in der Datei

sed -e ‚1,10d‘ AviationData.csv > Filtered_AviationData_removefirsttenlines.csv

• Filtern Sie alle Datensätze außer Datensätze 1 bis 10

sed -e ‚1,10!d‘ AviationData.csv > Filtered_AviationData_firsttenlines.csv

• Filtern von Datensätzen, die Kalifornien enthalten

sed -e ‚/California/d‘ AviationData.csv > Filtered_AviationData_nocalifornia.csv

• Filtern Sie alle Datensätze mit Ausnahme derDatensätze, die Florida enthalten

sed -e ‚/Florida/!d‘ AviationData.csv > Filtered_AviationData_justflorida.csv

• Filtern sie leere Zeilen

sed -e ‚/’/d‘ AviationData.csv > Filtered_AviationData_noemptylines.csv

Listing 7 verwendet denselben -e-Parameter,  um einen Sed-Ausdruck anzugeben, der auf eine Eingabedatendatei angewendet werden soll, wie dies in Der Liste 6 geschehen ist. Darüber hinaus wird die Ausgabe für jede sed-Aufgabe  auch in eine separate Datei umgeleitet, indem der Operator > am Ende verwendet wird.

Was Sed-Ausdrücke betrifft, so gibt „1d“  an, den ersten Datensatz in der Eingabedatendatei zu löschen. Der Ausdruck  ‚1,10d‘  gibt an, Datensätze eins bis zehn in der Eingabedatendatei zu löschen, wobei wie der Negationsausdruck  ‚1,10!d  angibt, alle Datensätze mit Ausnahme von einem bis zehn zu löschen. Schließlich sind die letzten beiden Aufgaben in Auflistung 6 Sed-Ausdrücke, die aus regulären Ausdrücken bestehen.  ‚/California/d‘  weist sed an, alle Datensätze zu löschen, die das Wort  California  und  ‚/Florida/!d‘ enthalten, um alle Datensätze zu löschen, die nicht das Wort Florida enthalten.  Schließlich weist der sed-Ausdruck  /’/d  sed an, leere Zeilen zu löschen, da der reguläre Ausdruck  /’/ mit dem Anfang einer Zeile (‚) und seinem Ende (‚) übereinstimmt, wobei nichts dazwischen steht — was leere Zeilen bedeutet.

Zusätzlich zu sedgibt es weitere Unix/Linux-Dienstprogramme, mit denen Sie Datensätze auf unterschiedliche Weise filtern können. Z. B. das Abrufen der ersten oder letzten Datensätze einer Datei mit einer einfacheren Syntax oder das Abrufen von Datensätzen bis zu einer bestimmten Menge an Kilobytes. Liste 8 veranschaulicht eine weitere Reihe von Aufgaben zum Filtern von Datensätzen mit dem Dienstprogramm  Kopf  und  Schwanz.

Auflisten 8 – Filtern von Datensätzen in einer xSV-Datei mit Kopf und Schwanz in einer Unix/Linux-Befehlszeile

• Abrufen der ersten fünf Datensätze einer Datei

• HINWEIS, wenn kein -n-Parameter angegeben ist, Kopf-Standard auf 10 Datensätze (d. h. ‚-n 10‘)

Kopf -n 5 AviationData.csv > Filtered_AviationData_first_five.csv

• Abrufen der letzten fünf Datensätze einer Datei

• HINWEIS, wenn kein -n-Parameter angegeben ist, Kopf-Standard auf 10 Datensätze (d. h. ‚-n 10‘)

Schwanz -n 5 AviationData.csv > Filtered_AviationData_last_five.csv

• Holen Sie sich jeden Datensatz, aber filtern Sie die letzten zwanzig Datensätze

Kopf -n -20 AviationData.csv > Filtered_AviationData_all_except_last_twenty.csv

• Holen Sie sich jeden Datensatz, aber filtern Sie die ersten zwanzig Datensätze

Schwanz -n +20 AviationData.csv > Filtered_AviationData_all_except_first_twenty.csv

• Erste 1024 Bytes einer Datei abrufen

Kopf -c 1024 AviationData.csv > Filtered_AviationData_first_1024_bytes.csv

• Erste 1024 Kilobyte (1 MB) einer Datei abrufen

Kopf -c 1024K AviationData.csv > Filtered_AviationData_first_1024_kilobytes.csv

• Abrufen jedes Datensatzes in einer Datei, mit Ausnahme der letzten 1024 Kilobyte (1 MB)

Kopf -c -1024K AviationData.csv > Filtered_AviationData_except_last_1024_kilobytes.csv

• Letzte 1024 Kilobyte (1 MB) einer Datei abrufen

Schwanz -c 1024K AviationData.csv > Filtered_AviationData_last_1024_kilobytes.csv

• Abrufen jedes Datensatzes in einer Datei, mit Ausnahme der ersten 1024 Kilobyte (1 MB)

Schwanz -c +1024K AviationData.csv > Filtered_AviationData_except_first_1024_kilobytes.csv

Mit dem Parameter -n  auf dem  Kopf  und  Schwanz können Sie eine bestimmte Anzahl von Datensätzen entweder vom oberen oder unteren Rand einer Datei extrahieren. Mit dem Parameter  -c  für einen dieser Befehle können Sie auch eine bestimmte Anzahl von Bytes oder Kilobyte extrahieren, ein Prozess, der hilfreich sein kann, wenn Datensätze in der Größe variieren und Sie eine bestimmte Menge an Beispieldaten abrufen möchten.

Ein weiterer häufiger Vorgang besteht darin, doppelte Datensätze zu filtern oder eine Liste eindeutiger Datensätze abzusuchen. Dies kann leicht mit einer anderen Kombination von Unix/Linux-Dienstprogrammen erreicht werden: uniq  und  sortieren. uniq  ist das eigentliche Dienstprogramm, das Wiederholungsdatensätze zählen kann, eine Liste eindeutiger Datensätze oder eine Liste von Wiederholungsdatensätzen erstellt, aber es gibt eine Eigenart, wie uniq funktioniert,  uniq funktioniert uniq  nur, wenn die Datensätze zusammenhängend sind. Wenn z. B. am Anfang der Datei ein Datensatz  13,A,2012  und am Ende ein identischer Datensatz  13,A,2012vorhandenist, kann uniq  diese Datensätze nicht als Wiederholungen oder eindeutig erkennen, es sei denn, sie befinden sich nebeneinander (d. h. zusammenhängend). Um Datensätze wie diese zusammenhängend zu erstellen, ist es notwendig, zuerst die Datensätze in der Datei zu sortieren, wo das  Sortier-Dienstprogramm  ins Bild kommt. Aus diesem Grund wird uniq fast immer in Verbindung mit sort  verwendet,  wie in Der Liste 9 veranschaulicht wird.

Auflisten 9 – Filtern von Datensätzen in einer xSV-Datei mit Kopf und Schwanz in einer Unix/Linux-Befehlszeile

Liste aller Datensätze ohne Wiederholungen

sortieren AviationData.csv | uniq > Filtered_AviationData_unique.csv

Liste aller Datensätze ohne Wiederholungen & Präfixanzahl von Datensatzvorkommen

sortieren AviationData.csv | uniq -c > Filtered_AviationData_unique_with_count.csv

• Liste nur der Wiederholungsdatensätze, Datensätze, die nur einmal angezeigt werden, werden gefiltert

sortieren AviationData.csv | uniq -d > Filtered_AviationData_duplicates.csv

• Liste nur der Wiederholungsdatensätze, Datensätze, die nur einmal angezeigt werden, werden gefiltert & Präfixanzahl von Datensatzvorkommen

sortieren AviationData.csv | uniq -dc > Filtered_AviationData_duplicates_with_count.csv

• Listen Sie nur alle eindeutigen Datensätze auf, Datensätze, die mehr als einmal angezeigt werden, werden gefiltert

sortieren Test.csv | uniq -u

Beachten Sie, dass die Eingabe für alle uniq-Vorgänge  in Auflistung 9 von einer vorherigen  Sortieraufgabe geleitet wird. Durch ausführen der Sortierung  AviationData.csv werden alle Datensätze in  AviationData.csv so sortiert, dass identische Datensätze nacheinander platziert werden. Die Ausgabe für diesen letzten Vorgang wird mit dem Unix  | Operator, um der Eingang für die  uniq-Aufgabe zu werden. Das  Dienstprogramm sort unterstützt eine Reihe von Parametern, die ich im nächsten Abschnitt erwähnen werde, aber für den Zweck der Verwendung mit  uniq  sind keine Parameter erforderlich.

Wenn keine Parameter an uniqübergebenwerden, ist die Ausgabe eine Liste von Nicht-Duplikate-Datensätzen , solange die Datensätze zusammenhängend sind, was aufgrund der  Sortieraufgabe garantiert ist. Wenn der Parameter -c mit uniq verwendet wird, wird jedem Datensatz eine Anzahl mit der Anzahl der Vorkommen angehängt. Wenn der Parameter -d mit uniq verwendet wird, ist seine Ausgabe nur Datensätze, die mehr als einmal angezeigt werden. Und wenn der Parameter -u mit uniq verwendet wird, ist seine Ausgabe nur Datensätze, die einmal angezeigt werden.

Sortieren von Datensätzen für X  X-Dateien (separated value, xSV)

Die Sortierung ist eine weitere häufige Operation, mit der ähnliche Datensätze entweder durch Zeichen, Zahlen oder sogar Datumsangaben zusammengefasst werden können. Dies kann besonders praktisch sein, wenn ähnliche Datensätze über eine Big-Data-Datei verteilt sind und Sie nur mit einer bestimmten Teilmenge von Datensätzen arbeiten möchten. Auf diese Weise reduzieren die Sortierdatensätze die Gesamtverarbeitungszeiten und erleichtern die Anwendung einiger der vorherigen Filter- und Änderungsaufgaben. Die Auflistung 10 veranschaulicht eine Reihe von Sortiervorgängen mit dem Dienstprogramm Sortierung  und  Takt.

Auflisten 10 – Sortieren von Datensätzen in einer xSV-Datei mithilfe von Sortierung und Tac in einer Unix/Linux-Befehlszeile

• Sortieren von Datensätzen, standardmäßig ASCII-Reihenfolge

Sortieren AviationData.csv > Sorted_AviationData_ascii.csv

• Sortieren von Datensätzen nach numerischem Zeichenfolgenwert

sortieren -n AviationData.csv > Sorted_AviationData_ascii_reverse.csv

• Sortierdatensätze, ASCII-Reihenfolge umgekehrt

sortieren -r AviationData.csv > Sorted_AviationData_ascii_reverse.csv

• Sortieren von Datensätzen basierend auf dem Wert der 3. Spalte in ASCII-Reihenfolge, wobei Spalten durch getrennt sind,

sortieren -t, -k 3 AviationData.csv > Sorted_AviationData_ascii_3rd_column.csv

• Sortieren von Datensätzen basierend auf dem Wert der 3. Spalte in ASCII-Reihenfolge, gefolgt von der Sortierung in der 5. Spalte (wenn der Wert der 3. Spalte gleich ist)

sortieren -t, -k 3,5 AviationData.csv > Sorted_AviationData_ascii_3rd_and_5th_column.csv

• Sortieren von Datensätzen basierend auf dem Wert der 5. Spalte mit dem allgemeinen numerischen Wert, wobei Spalten durch getrennt sind,

sortieren -g -t, -k 7 AviationData.csv > Sorted_AviationData_numeric_value_7th_column.csv

• Sortieren von Datensätzen basierend auf dem Wert der 4. Spalte, der ein Datum ist (z.B. 20.04.2012)

sortieren -t, -k 4.7,4.10 -k 4.1,4.2 -k 4.4,4.5 AviationData.csv > Sorted_AviationData_date_value_4th_column.csv

• Umkehren der Datensatzsortierung mit tac

tac AviationData.csv > Sorted_AviationData_reverse.csv

Die erste Sortieraufgabe  in der Auflistung 10 verwendet keine Parameter, d.h. alle Datensätze werden als monolithische Zeichenfolgen sortiert (d. h. es werden keine Trennzeichen berücksichtigt) und die Reihenfolge ist ASCII gewichtet. Bei Verwendung der ASCII-Reihenfolge haben Sonderzeichen die höchste Priorität, gefolgt von Zahlen und dann Buchstaben. Dies bedeutet, dass ein Datensatz, der mit einem beginnt,  vor einem mit einer Zahl beginnt, und ein Datensatz, der mit einem Zahlenbeschwichtigungsbericht beginnt, bevor er mit einem Buchstaben beginnt.

sort unterstützt jedoch verschiedene Parameter. Ein Parameter ist  -n, der die Sortierreihenfolge so ändert, dass sie als numerische Zeichenfolgenwerte anstelle des standardmäßigen ASCII ausgeführt wird. Ein weiterer Parameter zum Ändern der Sortierreihenfolge ist  -g,  der den Sortiervorgang als allgemeine numerische Werte definiert, anstelle des Standard-ASCII. Ein weiterer in  der Sortierung verfügbarer Parameter ist  -r, der die Datensatzreihenfolge eines Sortiervorgangs umkehrt (z. B. lässt das Anwenden von -r  Datensätze, die mit einem „Z“ beginnen, höher erscheinen als die mit ‚A‘, wobei die Standardeinstellung ist, Datensätze mit ‚A‘ höher als die mit ‚Z‘ zu sortieren).

Da Datensätze mit speziellen Zeichentrennzeichen unterschiedliche Werte aufweisen, kann es bequem sein, die Sortierung basierend auf einem bestimmten Feld durchzuführen. sort  unterstützt auch diese Art der Sortierung mit den Parametern  -t  und  -k. Der Parameter -t  empfängt das Feldzeichentrennzeichen — in diesem Fall  ,-(Komma) — wobei der Parameter -k die Feldnummer empfängt, auf der die Sortierung zu tun ist. Dies bedeutet, dass die  Aufgabensortierung -t, -k 3 AviationData.csv  in der Auflistung 10 die Datei  AviationData.csv basierend auf dem 3. Feldwert jedes CSV-Datensatzes sortiert. Es ist auch möglich, mehr als einen Sortierschlüssel zu verwenden, wenn  Sie sortieren,so dass für den Fall, dass mehrere Datensätze den gleichen Wert für den ersten Schlüssel haben, der zweite Schlüssel verwendet wird, um die Reihenfolge der Datensätze zu bestimmen.

Das vorletzte Beispiel in der Auflistung 10 veranschaulicht eine Sortieraufgabe, die einen zusammengesetzten Schlüssel verwendet, um eine Sortierung nach Datum auszuführen. In diesem Fall hat das 4. Feld für alle Datensätze Datumswerte (z.B.  20.04.2012). Um den Sortiervorgang auszuführen, damit Datumsangaben mit früheren Jahren das größte Gewicht haben, dann Monate und dann Datumsangaben, wird eine Dezimalnotation verwendet. Die Schlüsselreihenfolgesequenz  -k 4.7,4.10 -k 4.1,4.2 -k 4.4,4.5, gibt an, dass  4.7,4.10  die höchste Priorität hat und liest, um den Wert von der 7. bis 10. Zeichenposition auf der 4 zu nehmen. das erste Feld — das dem Jahr entspricht — gefolgt von dem Wert von der 1. bis 2. Zeichenposition auf dem 4. Feld — das dem Monat entspricht — gefolgt von dem Wert vom 4. bis zum 5. Zeichen auf dem 4. Feld — der dem Tag entspricht. Auf diese Weise werden Datensätze mit den ältesten Datumsangaben im 4. Feld nach oben sortiert, und Datensätze mit den letzten Datumsangaben im 4. Feld werden nach unten sortiert.

Schließlich verwendet das letzte Beispiel das Unix-Dienstprogramm tac,  das die Datensätze einer Datei in umgekehrter Reihenfolge ausgibt. Das Beispiel in Der Auflistung 10 ruft  tac in der Datei  AviationData.csv auf und leitet die Ausgabe mithilfe des Operators > in eine separate Datei  um. Damit wird die letzte Zeile in AviationData.csv  die erste auf der Ausgabe und die erste Zeile in  AviationData.csv die letzte auf der Ausgabe. tac  erfüllt die entgegengesetzte Aufgabe der Unix-Dienstprogrammkatze  . Wenn als  Katze den Inhalt einer Datei ausgibt, gibt tac den Inhalt der invertierten Datei aus, was die Begründung für die Namen beider Dienstprogramme ist —  Cat  ist  tac  invertiert.

 

Dieser Beitrag wurde unter SCRIPTING veröffentlicht. Setze ein Lesezeichen auf den Permalink.