Zeilenpakete alphabetisch sortieren

463
Paul Giroud

Anmerkung: Die ergänzende Frage ist hier: Wie werden Zeilen in mehreren „Chunks“ getrennt nach Kopfzeilen sortiert?


Ich fand also eine Antwort darauf, wie man Zeilen in Textdateien alphabetisch sortiert. Aber es ist nicht genau das, was ich tun muss. Ich habe diese Datei mit Profilen, die 15 verschiedene Parameter enthalten, die bei der Arbeit in ein Instrument eingehen und von der Maschine gelesen werden, um eine Liste von Profilen zu erhalten.

Leider sieht die Formatierung dieser Datei so aus:

[ProfileB] param1=z param2=y param3=x [ProfileA] param1=k param2=l param3= 

Ich möchte die Profile alphabetisch sortieren, aber ich muss sie mit ihren Parametern gruppieren. Das obige Beispiel sollte folgendermaßen sortiert werden:

[ProfileA] param1=k param2=l param3= [ProfileB] param1=z param2=y param3=x 

Ich denke, es gibt etwas zu arbeiten, entweder mit der festen Anzahl von Zeilen (Name + Parameter) oder mit dem Zeichen "[" als Bezeichner für den Beginn einer Gruppe von Zeilen.

Dies liegt jedoch außerhalb meiner Möglichkeiten bei der Textmanipulation. Ich habe entweder Sublime Text, R oder Linux Command Console zur Verfügung.

3
Müssen für das "Instrument" ** die Profile sortiert werden? glenn jackman vor 5 Jahren 0
Ich hoffe, dass jemand Ihnen helfen kann, aber in der Zwischenzeit sollten Sie eine interpretierte Sprache lernen, nicht so schwer wie C und nicht so fummelig wie Bash. So etwas wie Rubin oder Python oder Perl. barlop vor 5 Jahren 2
@glennjackman Nein, aber wenn die Datei nicht sortiert ist, werden die Profile in der gleichen Reihenfolge geladen wie in der Datei. Paul Giroud vor 5 Jahren 0
@barlop Ich habe Grundlagen in Python und Perl, und ich bin bereit, sie zu verwenden (was ich unter Zugriff auf die Befehlskonsole meinte) Paul Giroud vor 5 Jahren 1

2 Antworten auf die Frage

3
Kamil Maciorowski

Das funktioniert in meinem Debian:

sed '1 ! s/^\[/\x00\[/g' | sort -z | tr -d "\0" 

Um mit Dateien zu arbeiten, verwenden Sie die Umleitung (en), z. B. { sed … ; } <input.txt >output.txtwo sed …sich der gesamte Befehl befindet.

Das Verfahren ist wie folgt:

  1. sedfügt vor jedem Zeichen [, das sich am Anfang einer Zeile befindet, ein Nullzeichen ein, sofern es sich nicht um die erste Zeile handelt. Auf diese Weise trennen Nullzeichen die Profile.
  2. sort -z verwendet diese Nullzeichen als Trennzeichen, so dass ganze Profile und keine separaten Zeilen sortiert werden.
  3. tr löscht Nullzeichen.
Keine Beschwerde, ich habe Ausgangsdateien erhalten, als ich den `filter'-Teil gelöscht habe, um zu verstehen, was los war. Ich habe sie nicht mit dem ganzen Befehl. Paul Giroud vor 5 Jahren 0
Ich glaube, ich habe das Problem, und vielleicht liegt es daran, dass ich nicht klar genug war, was ich tun wollte. Ihre Lösung besteht darin, alle Zeilen innerhalb eines Profils (was ich in meinem Beispiel als param1, param2 und param3 bezeichnet habe) in alphabetischer Reihenfolge zu sortieren, die ursprüngliche Reihenfolge der Profile jedoch beizubehalten (wenn das erste Profil in der Liste [B] und das zweite Profil ist) [A], es wird so bleiben). Ich möchte die Profilnamen sortieren, nicht die darin enthaltenen Parameter (die bereits in alphabetischer Reihenfolge sind). Paul Giroud vor 5 Jahren 1
Tut mir leid, Englisch ist nicht meine Muttersprache, und ich habe einen Fehler in meiner Anfrage gemacht! vielen Dank Paul Giroud vor 5 Jahren 0
0
Alexey Ivanov

Hier ist ein kleines Perl-Skript, das die Aufgabe erfüllt:

my %profiles; my $profile;  while (<>) { if (/\[(.+)\]/) { $profile = $1; next; } next if !defined $profile;  chop if /\n$/; push @{ $profiles{$profile} }, $_; }  foreach my $key (sort keys %profiles) { print "[$key]\n"; foreach my $line (sort @{ $profiles{$profile} }) { print "$line\n"; } } 

Speichern Sie es beispielsweise in einer Datei sortProfiles.plund führen Sie Folgendes aus:

perl sortProfiles.pl <inputFile.txt >outputFile.txt 

Wie es funktioniert

  1. Es liest die Eingabedatei ( while (<>)).
  2. Für jedes Profil [profile]in der Eingabedatei speichert es seinen Namen in $profileVariable.
  3. Es speichert jede Zeile hinter dem Profilheader in einem Array.
  4. Dann werden die Schlüssel des %profilesHashes sortiert .
  5. Es sortiert auch die Zeilen innerhalb des Arrays.

In diesem Skript %profilesist ein Hash. Ihre Schlüssel sind Profilnamen, ihre Werte sind Zeilenarrays .
Dies @{ $profiles{$profile} }ist das Array, das Zeilen für den Profilnamen in $profileVariablen speichert .

Ich denke, das beantwortet sowohl diese Frage als auch die [komplementäre] (https://superuser.com/q/1328504). Alexey Ivanov vor 5 Jahren 0