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.