GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Textdateien mit mehreren Zeilen als Reihe sortieren

msort(1) wurde entwickelt, um Dateien mit mehrzeiligen Datensätzen sortieren zu können. Es hat eine optionale GUI sowie eine normale und für Menschen nutzbare Befehlszeilenversion. (Zumindest Menschen, die Handbücher gerne sorgfältig lesen und nach Beispielen suchen...)

AFAICT, Sie können kein willkürliches Muster für Datensätze verwenden, es sei denn, Ihre Datensätze haben eine feste Größe (in Bytes, nicht in Zeichen oder Zeilen). msort hat einen -b Option für Datensätze, die Zeilenblöcke sind, die durch Leerzeilen getrennt sind.

Sie können Ihre Eingabe in ein Format umwandeln, das mit -b funktioniert ganz einfach, indem Sie vor jede ###... eine Leerzeile setzen (außer dem ersten).

Standardmäßig gibt es Statistiken auf stderr aus, also ist es zumindest leicht zu erkennen, wenn es nicht sortiert hat, weil es dachte, die gesamte Eingabe sei ein einziger Datensatz.

msort arbeitet mit Ihren Daten. Die sed Befehl stellt jedem #+ einen Zeilenumbruch voran Zeile außer Zeile 1. -w sortiert den gesamten Datensatz (lexikografisch). Es gibt Optionen, um auszuwählen, welcher Teil eines Datensatzes als Schlüssel verwendet werden soll, aber ich habe sie nicht benötigt.

Ich habe auch darauf verzichtet, die zusätzlichen Zeilenumbrüche zu entfernen.

$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null 
####################################
KEY1
VAL11
VAL12
VAL13
VAL14

####################################
KEY2
VAL21
VAL22
VAL23
VAL24

####################################
KEY3
VAL31
VAL32
VAL33
VAL34

Ich hatte kein Glück mit -r '#' um das als Datensatztrennzeichen zu verwenden. Es dachte, die ganze Datei wäre ein Datensatz.


Eine Lösung besteht darin, zuerst die Zeilenvorschübe innerhalb eines Blocks in ein unbenutztes Zeichen Ihrer Wahl ('|' im Beispiel unten) zu ändern, das Ergebnis zu sortieren und das gewählte Trennzeichen wieder auf den ursprünglichen Zeilenvorschub zu ändern:

sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'

perl -0ne 'print sort /(#+[^#]*)/g' file.txt
  • perl -0 schlürft die gesamte Datei
  • /(....)/g Abgleichen und Extrahieren der Datensätze
  • print sort ... sortieren und ausdrucken

Linux
  1. Awk Einzeiler und Skripte, die Ihnen beim Sortieren von Textdateien helfen

  2. Ventoy:So erstellen Sie ein Multiboot-USB-Laufwerk mit mehreren ISO-Dateien

  3. Kann Textdateien mit Openssl unter Ubuntu 18.04 nicht entschlüsseln?

  4. Mehrere Dateitexte durch Sed ersetzen?

  5. CloudCross – Synchronisieren Sie Dateien und Verzeichnisse mit mehreren Cloud-Speichern

Synchronisieren Sie Dateien zwischen mehreren Systemen mit Syncthing

Verbinden mehrerer Felder in Textdateien unter Unix

Linux-Befehl oder -Skript, das doppelte Zeilen in einer Textdatei zählt?

PDF-Dateien mit numerischer Sortierung zusammenführen

Tail mehrere entfernte Dateien

So holen Sie mit Ansible mehrere Dateien vom Remote-Computer auf den lokalen Computer