bash, zeilen sortieren, sortiermuster
bash, zeilen sortieren, sortiermuster
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
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
Re: bash, zeilen sortieren, sortiermuster
Klingt wie nach einem Fall für den Befehl sort. Mit der Option key.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.
Das verstehe ich nicht genau. Sollen dort die Zeilen in der gleichen Reihenfolge vertauscht werden wie bei der ersten?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.
- Feuerstein
- Beiträge: 565
- Registriert: 10.03.2012 15:28:36
- Wohnort: Unterwasser
Re: bash, zeilen sortieren, sortiermuster
ls -X
und "man ls" nicht vergessen zu lesen.
EDIT:
LG
Feuerstein
und "man ls" nicht vergessen zu lesen.
EDIT:
Vorausgesetzt ich verstehe Dich richtig. Wenn es eine Textdatei ist warum den nicht copy and paste?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.
LG
Feuerstein
Re: bash, zeilen sortieren, sortiermuster
@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
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
Re: bash, zeilen sortieren, sortiermuster
Mittels paste (siehe man paste) aus den zwei Dateien eine erzeugen, dann sortieren, evtl wieder in zwei Dateien aufteilen.
MfG GoKi
:wq
:wq
Re: bash, zeilen sortieren, sortiermuster
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
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
Re: bash, zeilen sortieren, sortiermuster
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
Gut, dass auch schon vernünftige Vorschläge gepostet wurden
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
Beware of programmers who carry screwdrivers.
Re: bash, zeilen sortieren, sortiermuster
@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...
...so in etwa?
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
Re: bash, zeilen sortieren, sortiermuster
+1GoKi hat geschrieben:Mittels paste (siehe man paste) aus den zwei Dateien eine erzeugen, dann sortieren, evtl wieder in zwei Dateien aufteilen.
Use ed once in a while!
Re: bash, zeilen sortieren, sortiermuster
Ja, die Lösung mit paste ist wirklich schön. Ich hab datei1 und datei2 von yeti übernommen.Meillo hat geschrieben:+1GoKi hat geschrieben:Mittels paste (siehe man paste) aus den zwei Dateien eine erzeugen, dann sortieren, evtl wieder in zwei Dateien aufteilen.
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