Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

U

Ulli01

Grünschnabel
Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und bei doppelten Einträgen eine der beiden Zeilen komplett gelöscht werden soll.
Die Ausgabe kann nach "stdout" erfolgen. Ich habe nur sed, uniq und grep zur Verfügung (Busybox).

Ausgangsdatei:
"Wort1 Wort2 Wort3 ab hier ist es egal1 "
"Wort1 Wort2 Wort3 ab hier ist es egal2"
"Wort1 Wort2 Wort4 ab hier ist es egalx"

stdout sollte dann so aussehen:
"Wort1 Wort2 Wort3 ab hier ist es egal1"
"Wort1 Wort2 Wort4 ab hier ist es egalx"

Wie lautet die Syntax dafür? Der Hacken an der Geschichte ist, dass ich die Zeilen nicht einfach bis zum 3. Leerzeichen abschneiden darf.

Gruß Ulli01
 
Hacken kannst Du im Garten.

Was sagt denn man sort und man uniq zu der Thematik? Wie ist Dein aktueller Ansatz?
 
Ich habe noch überhaupt keinen Plan wie ich die Suche nach dem 3. Leerzeichen pro Zeile stoppen kann. Derzeit habe ich nur komplett doppelte Zeilen entfernt und dann den Inhalt der Ausgabe weiter verarbeitet. Zur Optimierung des Ergebnisses wollte ich mein Script um diese Funktion erweitern. Im Moment leite ich die Ausgaben noch in separate Dateien zur Fehlerkontrolle, später soll alles über stdin und stdout laufen. Nicht wundern über den Zusammenbau der URL, die beinhaltet immer das aktuelle Datum.

Ich stelle das Script mal hier rein:
Code:
#!/bin/sh
echo "Wechsel nach /tmp"
cd /tmp
echo "Datum ermitteln und URL zusammenbauen"
d=http://www.Domain.com/`date +%Y-%m-%d`
echo "Datei holen und ablegen"
wget --user-agent="Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5" $d -O lines.txt, --output-document=/tmp/lines.txt
echo "Loesche alte Datei suche strings und gib sie aus"
rm /tmp/linesoutput.txt
grep '^<br>C:' /tmp/lines.txt >> /tmp/linesoutput.txt
echo "Ueberfluessige Zeichen entfernen (<br>)"
grep -o "C:.*"  /tmp/linesoutput.txt  >  /tmp/linesoutput1.txt
echo "Doppelte Eintraege entfernen"
sort linesoutput1.txt | uniq > linesoutput2.txt
echo "Neueste Eintragungen nach oben stellen"
sed '1!G;h;$!d' /tmp/linesoutput2.txt > /tmp/linesoutput3.txt
--------------------------> Hier soll die Optimierung eingebaut werden  <----------------------------------------------
echo "Datei auf 30 Zeilen kürzen"
sed -n '1,30p' < /tmp/linesoutput3.txt > /tmp/linesoutput4.txt
echo "Loesche alle alten Zeilen in /etc/Lines.cfg"
sed '/^C:/d' /etc/Lines.cfg > /tmp/Lines.txt
sed '/^N:/d' /tmp/Lines.txt > /tmp/Lines.cfg
echo "Schreibe Lines.cfg neu"
mv /tmp/Lines.cfg /etc/Lines.cfg
echo "Fuege neue strings ein"
cat /tmp/linesoutput4.txt >> /etc/Lines.cfg
echo "fertig"
exit 0
[code]
Wenn ich die Suche bis zum 3. Leerzeichen begrenzen kann bekomme ich den Rest selbst gebacken. Danke schon einmal das sich hier meines Problems angenommen wird.
Ein Gedankengang wäre, die komplette Datei zu kopieren alles nach dem 3. Leerzeichen zu entfernen und danach den Inhalt der doppelten Zeilen zu löschen. Jetzt die Zeilen incl. der leeren Zeilen in beiden Dateien zu nummerieren (es sind max. 99 Zeilen) und nun in der originalen Datei die Zeilen zu löschen, welche in der bearbeiteten Datei nur eine Nummerierung enthält. Das sollte eigentlich funktionieren, übersteigt aber im Moment meinen Horizont, wie ich das auf die Originaldatei (linesoutput3.txt) anwenden kann.

Gruß Ulli01
 
Zuletzt bearbeitet:
Wie üblich gibt's viele Möglichkeiten. Am einfachsten wäre vermutlich einer der folgenden Ansätze:
* man sort - Da gibt's einen Parameter, der sagt, auf welchen Spalten denn die Sortierung stattfinden soll - damit wird der Rest ignoriert (beim Sortieren)
* zieh' Dir die ersten 3 Spalten raus in eine sep. Datei (man cut), entferne daraus die doppelten Einträge (uniq, sort, je nach Lust und Laune) und nimm diese Datei dann als Pattern-Liste für grep in Verbindung mit "nur ersten Match ausgeben"
* Assoziative Arrays

... mehr lässt sich sicherlich noch finden, wenn man denn weiß, was das denn überhaupt soll und wie konkret die Daten aussehen. Abgesehen davon - so wichtig kann ja alles nach der 3. Spalte nicht sein, wenn es für die Ausgabe egal ist. Warum also das mitschleppen und nicht einfach wegwerfen?
 
Vielen Dank für den Hinweis zum Lösungsansatz, ich werde mich mal durchkämpfen.

Ulli01
 
* zieh' Dir die ersten 3 Spalten raus in eine sep. Datei (man cut), entferne daraus die doppelten Einträge (uniq, sort, je nach Lust und Laune) und nimm diese Datei dann als Pattern-Liste für grep in Verbindung mit "nur ersten Match ausgeben"

Hallo Ulli, bezüglich "nach Suchmuster suchen" kann man mit grep dann auch Zeilennummern ausgeben lassen. Diese könnte man mit "cut" ebenfalls rausfiltern und dann sed direkt anweisen, betreffende Zeile zu löschen. So habe ich das mal gemacht. Meine Lösungen sind hier aber meist zu umständlich gedacht ; )
 

Ähnliche Themen

Datei Inhalt sortieren!

Zurück
Oben