bash, zeilen sortieren, sortiermuster

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

bash, zeilen sortieren, sortiermuster

Beitrag von root2root » 06.04.2012 08:48:03

Hallo Team,

ich möchte folgendes machen:

In einer 170zeiligen Textdatei ist enthalten:
...
Lage 10
Lage 7
Lage 1
Lage 64
Lage 54
Lage 97
...

Das soll sortiert werden

Lage 1
Lage 7
Lage 10
...
also den Zahlen nach aufsteigend.

Dieses Sortiermuster wonach diese Datei sortiert wurde soll nun auf eine weitere Textdatei mit gleicher Zeilenanzahl angewendet werden. Es ist nur Text enhalten und kein Sortierkriterium.

Was ist zu tun ?

Gruß root2root

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: bash, zeilen sortieren, sortiermuster

Beitrag von Liffi » 06.04.2012 08:56:00

root2root hat geschrieben:Hallo Team,

ich möchte folgendes machen:

In einer 170zeiligen Textdatei ist enthalten:
...
Lage 10
Lage 7
Lage 1
Lage 64
Lage 54
Lage 97
...

Das soll sortiert werden

Lage 1
Lage 7
Lage 10
...
also den Zahlen nach aufsteigend.
Klingt wie nach einem Fall für den Befehl sort. Mit der Option key.
Dieses Sortiermuster wonach diese Datei sortiert wurde soll nun auf eine weitere Textdatei mit gleicher Zeilenanzahl angewendet werden. Es ist nur Text enhalten und kein Sortierkriterium.
Das verstehe ich nicht genau. Sollen dort die Zeilen in der gleichen Reihenfolge vertauscht werden wie bei der ersten?

Benutzeravatar
Feuerstein
Beiträge: 565
Registriert: 10.03.2012 15:28:36
Wohnort: Unterwasser

Re: bash, zeilen sortieren, sortiermuster

Beitrag von Feuerstein » 06.04.2012 08:58:17

ls -X

und "man ls" nicht vergessen zu lesen.

EDIT:
root2root hat geschrieben:

Dieses Sortiermuster wonach diese Datei sortiert wurde soll nun auf eine weitere Textdatei mit gleicher Zeilenanzahl angewendet werden. Es ist nur Text enhalten und kein Sortierkriterium.
Vorausgesetzt ich verstehe Dich richtig. Wenn es eine Textdatei ist warum den nicht copy and paste?

LG
Feuerstein

root2root
Beiträge: 168
Registriert: 22.10.2007 13:06:29

Re: bash, zeilen sortieren, sortiermuster

Beitrag von root2root » 06.04.2012 12:54:07

@Liffi
Das verstehe ich nicht genau. Sollen dort die Zeilen in der gleichen Reihenfolge vertauscht werden wie bei der ersten?


Ja genau. Der Tauschprozess für di 2. Datei muß genauso durchgeführt werden. Die beiden haben inhaltlich nix miteinander zu tun.
Die Zeilen müssen nur wieder paarig fallen.

So:

Vorher

1. Datei 2. Datei

Lage 10 textC
Lage 3 textB
Lage 1 textA
Lage 17 textD

Sortieren...

1. Datei 2. Datei
Lage 1 textA
Lage 3 textB
Lage 10 textC
Lage 17 textD

mfg root2root

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: bash, zeilen sortieren, sortiermuster

Beitrag von GoKi » 06.04.2012 13:17:52

Mittels paste (siehe man paste) aus den zwei Dateien eine erzeugen, dann sortieren, evtl wieder in zwei Dateien aufteilen.
MfG GoKi
:wq

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash, zeilen sortieren, sortiermuster

Beitrag von Cae » 06.04.2012 14:46:47

Vielleicht awk und Quicksort [1]? Du liest die zu sortierende Datei ein, sortierst sie und machst parallel genau dieselben Operationen für die zweite Datei.

Gruß Cae

[1] http://awk.info/?quicksort
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: bash, zeilen sortieren, sortiermuster

Beitrag von cosmac » 06.04.2012 16:37:38

hi,

wenn man ein paar Annahmen macht, geht es auch alleine mit der bash ;)
* keine Lage kommt doppelt vor
* die erste Datei muss eigentlich garnicht sortiert werden
* sie sieht ziemlich genau so wie im Beispiel aus
* die Zahlen geben die Reihenfolge für die Texte vor
* es handelt sich nur um wenige hundert Zeilen oder man ist sehr geduldig

Code: Alles auswählen

#!/bin/bash

[ -z "$1" -o -z "$2" ] && echo "usage: $0 Lagendatei Textdatei"
11< "$1" || exit 1
11< "$2" || exit 1

maxlage=0
line1=1
line2=1

read_lagen () {
   while read -u11 dummy lage; do
      [ "$dummy" != "Lage" ] && return 1
      [ -z ${index[$lage]} ] || return 2
      index[$lage]=$line1
      [ $lage -gt $maxlage ] && maxlage=$lage
      let line1++
   done
   return 0
}

read_texte () {
   while read -u11 text[$line2]; do
      let line2++
   done
}

11< "$2"  read_texte
11< "$1"  read_lagen

case $? in
   0) if [ $line1 != $line2 ]; then
         echo "$1 und $2 sind unterschiedlich lang" 1>&2
         exit 1
      fi
      ;;
   1) echo "$1 ist keine Lagendatei" 1>&2
      exit 1
      ;;
   2) echo "$1, Zeile $line1: doppelte Lagennummer" 1>&2
      exit 1
      ;;
esac

for (( i = 0; i <= maxlage; i++ )) do
   n=${index[$i]}
   [ -z $n ] && continue
   echo ${text[$n]}
done
Gut, dass auch schon vernünftige Vorschläge gepostet wurden ;)
Beware of programmers who carry screwdrivers.

yeti

Re: bash, zeilen sortieren, sortiermuster

Beitrag von yeti » 07.04.2012 08:57:00

@Cae ... das setzt im Wesentlichen Deinen Ansatz um, überläßt dabei aber das Sortieren dem darauf spezialisierten Helferlein sort und awk muß dann "nur noch" das was sort tat auf die 2te Datei anwenden...

Code: Alles auswählen

~/xxx$ cat datei1
Lage 10
Lage 7
Lage 1
Lage 64
Lage 54
Lage 97
~/xxx$ cat datei2
Text-zu-Lage-10
Text-zu-Lage-7
Text-zu-Lage-1
Text-zu-Lage-64
Text-zu-Lage-54
Text-zu-Lage-97
~/xxx$ cat -n < datei1 | sort -n -k3 | tee >(cut -f2- >datei1.sortiert) | awk 'BEGIN { l=0 } FILENAME=="-" { P[$1]=NR ; next } FILENAME!="-" { L[++l]=$0 ; next } END { for( p=1 ; p<=l ; p++ ) print L[P[p]] }' - datei2 > datei2.sortiert
~/xxx$ cat datei1.sortiert
Lage 1
Lage 7
Lage 10
Lage 54
Lage 64
Lage 97
~/xxx$ cat datei2.sortiert
Text-zu-Lage-1
Text-zu-Lage-7
Text-zu-Lage-10
Text-zu-Lage-54
Text-zu-Lage-64
Text-zu-Lage-97
...so in etwa?

Benutzeravatar
Meillo
Moderator
Beiträge: 9267
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash, zeilen sortieren, sortiermuster

Beitrag von Meillo » 07.04.2012 10:19:22

GoKi hat geschrieben:Mittels paste (siehe man paste) aus den zwei Dateien eine erzeugen, dann sortieren, evtl wieder in zwei Dateien aufteilen.
+1
Use ed once in a while!

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: bash, zeilen sortieren, sortiermuster

Beitrag von Liffi » 07.04.2012 11:39:32

Meillo hat geschrieben:
GoKi hat geschrieben:Mittels paste (siehe man paste) aus den zwei Dateien eine erzeugen, dann sortieren, evtl wieder in zwei Dateien aufteilen.
+1
Ja, die Lösung mit paste ist wirklich schön. Ich hab datei1 und datei2 von yeti übernommen.

Code: Alles auswählen

% paste datei1 datei2 | sort -n -k2 | cut -f2-
Text-zu-Lage-1
Text-zu-Lage-7
Text-zu-Lage-10
Text-zu-Lage-54
Text-zu-Lage-64
Text-zu-Lage-97
EDIT:: Urspünglich wollte ich eine Perl Lösung vorschlagen, aber so einfach schön und gut ging es nicht :-)

Antworten