auch ich mit sortieren

flappinski

flappinski

Foren As
hallo ich habe folgendes Problem. Ich habe eine Datei, in der sehr viele Zeilen immer mit ca. 10 Feldern stehen. Ich will eine Ausgabe der Zeilen die das gleiche erste Feld haben.
Jetzt bin ich schon so weit, dass ich eine Liste dieser Felder bekomme mit (sort.txt ist vorsortiert):

awk -F "\t" '{print $1}' sort.txt | uniq -d

jetzt brauche ich eigentlich diese Liste nur mit einem grep aus der sort.txt auszulesen. Wie mache ich das?
Danke,
Stephan
 
Ich begreife nicht ganz, was du machen möchtest. Kannst du vielleicht kurz tippeln, was in der sort.txt steht und wie dein output aussehen soll?
 
Hallo
Ich vermute mal, dass du dir awk sparen kannst.
sort kennt auch Feldtrenner und ein eingesetztes cut ist enorm effizienter als awk (falls du nur die erste Spalte ausgeben willst). Auch kannst du sort sagen, nach welchem Feld sortiert werden soll.

Aber wie schon gesagt: Ein paar Beispieldaten mit erhofftem Ergebnis und verwendeter Shell bzw OS ist nötig.

Gruß Wolfgang
 
ein bisschen spät...

Hi,
sorry, hatte gerade viel um die Ohren. Cut kannte ich noch gar nicht, sowas suche ich schon lange, vielen Dank schon mal dafür.
So nun zum Grundproblem:
Folgende Datei sort.txt:
rs1 1 1.1 11.1
rs2 2 2.1 22.1
rs3 3 3.1 33.1
rs4 4 4.1 44.1
rs5 5 5.1 55.1
rs4 6 6.1 66.1
rs2 7 7.1 77.1
rs6 8 8.1 88.1

Wenn ich sortiere will ich das:
rs2 2 2.1 22.1
rs2 7 7.1 77.1
rs4 4 4.1 44.1
rs4 6 6.1 66.1

Das bekomme ich im Moment nur so (bis getern mit umständichem awk -Befehl):
cut -f 1 sort.txt | sort | uniq -d
und das Ergebnis greppe ich dann von Hand. Ganz schön unelegant, oder?

Das hier kommt meinem eigentlichen Problem recht nahe:
sort +0 -1 sort.txt -u

nur liefert das halt gerade die doppelten nicht. Aber immerhin sieht er das doppelte nur anhand des ersten Feldes, das ist genau mein Wunsch! Wie bekomme ich jetzt sort dazu mir nur die doppelten darzustellen, do ähnlich wie es uniq -D macht (dieser Befehl erkennt aber nur vollständig-doppelte Zeilen).

Ach ja, ich benutze die bash auf einem UBUNTU 6.06 System. Habe ich jetzt alle Klarheiten beseitigt?
Viele Grüsse und Danke schon mal,
Stephan
 
Fortsetzung:
habe gerade -f bei uniq gefunden. das ignoriert die ersten n Felder. Jetzt funktioniert das super, wenn mein ersten Feld an letzter Stelle steht, also so:
rs1 1 1.1 11.1 rs1
rs2 2 2.1 22.1 rs2
rs3 3 3.1 33.1 rs3
rs4 4 4.1 44.1 rs4
rs5 5 5.1 55.1 rs5
rs4 6 6.1 66.1 rs4
rs2 7 7.1 77.1 rs2
rs6 8 8.1 88.1 rs6

und dann:
sort sort.txt | uniq -f 4 -D
das bringt genau das, was ich will! Nur wie bekomme ich das erst Feld an die letzte Stelle? Hat da jemand eine schnelle Lösung? Ohne Awk?
uniq (GNU coreutils) 5.93
Copyright (C) 2005 Free Software Foundation, Inc.
 
@ Wolfgang und Peregrine:
jetzt habe ich mir die Mühe gemacht und ganz ausführiche Beispiele gebracht und dann seid ihr stumm? Schade, aber ich bin ja auch jast am Ziel, irgendwie wurschtel ich mich schon durch, dennoch danke,
Stephan
 
@ Wolfgang und Peregrine:
jetzt habe ich mir die Mühe gemacht und ganz ausführiche Beispiele gebracht und dann seid ihr stumm? Schade, aber ich bin ja auch jast am Ziel, irgendwie wurschtel ich mich schon durch, dennoch danke,
Stephan
Ups
Den Beitrag habe ich wirklich übersehen.
Sorry!
Da du ja nun eine Lösung gefunden hast, hat sich die sache doch erledigt oder?

Dass du dir awk sparen kannst, habe ich vermutet bevor ich die genauen Daten kannte.
In diesem Fall aber, würde ich das doch lieber gleich mit perl oder auch awk machen. Und zwar alles.

Du kannst Natürlich auch mit einem while read Konstruckt die Teile vertauscht ausgeben. Allerdings musst du dann die Feldzahl kennen und sie sollte konstant sein.

Code:
cat text|while read V1 V2 V3 V4;
do
echo -ne "$V4 $V3 $V2 $V1 \n";
done
Gibt zum Beispiel alle Felder in umgekehrter Reihe aus.

Gruß Wolfgang
 
Ups, jetzt war Wolfgang schneller. Aber egal, vielleicht hilft auch folgendes:

Code:
sort sort.txt | sed -e 's!^\([^ ]*\) \(.*\)$!\1 \2 \1!'

Es ist nicht auf die Anzahl der Felder angewiesen.

Gruss, Xanti
 
jep, vielen dank, jetzt bin ich fast ganz glücklich. es funktioniert soweit, nu den sed befehl kapier ich gar nicht. würde es Dir viel ausmachen, kurz zu erläutern, was da paseiert, Xanti? Da steige ich nicht mehr durch.
Aber wie gesagt, danke Euch beiden. und einen schönen Sonntag abend noch...
 
Code:
sed -e 's!^\([^ ]*\) \(.*\)$!\1 \2 \1!'

Das Ganze ist nicht so schwierig. Es sieht nur kompliziert aus.

sed -e 'befehl' ... Wende befehl auf den durch die Pipe geleiteten Stream an.

s!suchmuster!ersetzung! ... substitute-Befehl: suche nach suchmuster und ersetze es durch ersetzung.

^ ... Matche Anfang der Zeile.

\(...\) ... Alles, was zwischen den Klammern gematcht wird, wird in den Variablen \1 \2 ... gespeichert, \1 für die erste Klammer, \2 für die zweite Klammer ...

[...] ... Bezeichnet eine Klasse zu erkennender Zeichen, [^...] negiert diese.

* ... bezeichnet eine beliebige (0-...) Anzahl des vorhergehenden Zeichens/Klasse.

$ ... Matche Ende der Zeile.

Mehr dazu auch unter man sed.

Gruss, Xanti
 
Zuletzt bearbeitet:
danke schoen für diese erklärung, mich haben am meisten die ! statt / irritiert, dadurch konnte ich mich gar nciht zurech finden, und mit sed habe ich bisher nur einfache Ersetzungen gemacht und keine Variablenspeicherungen.
Viel Spass noch und vielen Dank,
Stephan
 
Es ist relativ egal, welches Zeichen man für die Substitution benutzt. sed weiss, dass das erste Zeichen nach s das Trennungszeichen ist.

Gruss, Xanti
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

Spalten einer Datei in neue Datei integrieren.

String einer bestimmten Zeile durchsuchen

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

SED und TCPDUMP

Zurück
Oben