Parameter an "sed" aus einer datei übergeben

G

Ghostrider

Grünschnabel
hallo zusammen,

Versuche krampfhaft einen script auf die beine zu stellen, aber leider gelingt es mir nicht. Die Boardsuche habe ich auch schon misbraucht, aber ohne erfolg.

zu mein problem:

ich habe eine Liste "Haupt.Liste" ( bestehend aus 4 stelligen Hexzahlen) die dynamisch erstellt wird. Nach bestimte Kriterien werden einige zahlen aussortiert und in einer 2.Liste "Sort.Liste" abgelegt.

Nun möchte ich die zahlen die aussortiert wurden (also die , in der Sort.liste), aus der hauptliste entfernen.

Das Problem ist nur, das daß Skript auf einen Linux Server läuft, was nicht alle shell befehle unterstützt.
So wie "cut" und "diff", was die aufgabe vereinfachen würde.

jetzt habe ich gedacht, das man die zeilennummer ermitteln und die dann mit "sed" löschen könnte.

Also so:

dif=`cat /tmp/Sort.Liste`
for l in ${dif}
do
grep -n "$l" /tmp/Haupt.Liste|sed s/:.*$// >> /tmp/zeilenNR
done

Nun weiß ich aber nicht wie ich den "sed" beibringen könnte die zeilennummern aus der datei zu lesen und hintereinander abzuarbeiten.

Hat jemand vielleicht einen Tipp für mich, oder eine andere Lösung wie ich die Zahlen aus der Haupt.Liste löschen könnte ??

Bin für jede Hilfe Dankbar !!

mfg
Ghostrider
 
Hallo
Um dir zu helfen, muss ich nochmal nachfragen:
Wenn ich das richtig verstehe, hast du zwei Dateien.
Der Inhalt der zweiten Datei soll aus der ersten Datei gelöscht werden.
Content-file3=content-file1 - Content-file2

Korrigiere mich, wenn ich das falsch verstehe.

Nun die Frage:
Wie sehen die Daten aus?
Stehen die jeweils auf einer Zeile?
Also ein Beispieldatensatz würde hier weiterhelfen.
Können die daten denn doppelt vorkommen, oder sind diese auf eine Zeilennummer festgelegt?

Zu sed und Zeilennummer:
sed kennt im Adressbereich Zeilennummern.
Beispiel
sed -e '1,5 s/suchstring/replace-string/g' <textdatei >outputdatei
Hier wird suchstring mit replacestring ersetzt, aber nur in Zeile 1 bis 5
Eventuell hilft dir das weiter.
Ansonsten schieb mal ein paar Beispieldatensätze rüber, dann werden dir geholfen ;)
Bisher ließ sich noch das Meiste hier lösen.
Eine Lösung mit perl, lass ich vorerst mal weg, da du ja mit sed arbeiten willst und das Ergebnis so einen größeren Selfmade-effekt hat.
Du willst ja beim nächsten Problem dieser Art nicht gleich wieder vorm Scheunentor stehen. :oldman
Gruß Wolfgang
 
Wolfgang_1 schrieb:
Hallo
Um dir zu helfen, muss ich nochmal nachfragen:
Wenn ich das richtig verstehe, hast du zwei Dateien.
Der Inhalt der zweiten Datei soll aus der ersten Datei gelöscht werden.
Content-file3=content-file1 - Content-file2

ja das ist richtig.

Nun die Frage:
Wie sehen die Daten aus?

Hauptliste: (file1)
0178
0A7A
0B74
1632
17DF
1D6D
1FD6
2540
26CC
272D
2866
3216
3F55
4BE5
4F07
5877
654C
67AB
6B77
7CED
7DB5
88AA
A515
B0C6
C0A6
C444
CB04
E582

Sort.Liste (file2)
C444
CB04
E582

Aber die zahlen ändern sich ständig, weil die dynamisch erstellt werden.
Also es kann auch vorkommen, das garkeine zeilen , oder nur die 5., oder die 5. und die 19. gelöscht werden müssen.

Das script , was die zeilennummer ermittelt, erstellt einen datei was so aussieht.

zeilenNR
26
27
28

Stehen die jeweils auf einer Zeile?
Können die daten denn doppelt vorkommen, oder sind diese auf eine Zeilennummer festgelegt?

Stehe wie oben, jeweils auf einer Zeile und kommen nur einmal vor

Ansonsten schieb mal ein paar Beispieldatensätze rüber, dann werden dir geholfen ;)

Ich hänge hier die Beispieldateien an

Eine Lösung mit perl, lass ich vorerst mal weg

Perl wird leider auch nicht unterstützt. Man kann nur binary's ausführen, oder den Bourne-Shell verwenden, was aber auf ein minimum reduziert wurde :(

Danke für deine Hilfsbereitschaft!!

mfg
Ghostrider
 

Anhänge

  • Beispiel.zip
    573 Bytes · Aufrufe: 3
Zuletzt bearbeitet:
Hallo
Schade, denn in perl wär das ein klassischer Einzeiler. ;)
Nagut ich habe mal folgendes versucht, ist nicht so elegant, sollte aber gehen.
Allerdings lasse ich dabei sed weg.

Code:
#!/bin/bash
FILE1="sortliste";
FILE2="Hauptliste";
D=($(cat $FILE1));
while read WERT
do
   NOT="nothing";
   for I in ${D[*]}
   do
     if [ "$I" = "$WERT" ];
     then
     NOT="del";
     fi
   done
  if  [ "$NOT" = "nothing" ]; then
   echo $WERT;    
  fi
done < $FILE2 >>result
Man könnte zwar mit verkoppelten grep und einer ellenlangen Pipe rumbasteln, was mir aber alles nicht so recht zusagte.
Deshalb diesen Vorschlag, der etwas übersichtlicher ist.

Ist zwar sicher nicht elegant (aber das bin ich wenn überhaupt eher in perl), sollte jedoch funktionieren.

Wenn die Sortliste allerdings riesig wird, könnte es ein Problem geben.

Habe mal in den News ein Posting dazu abgesetzt,weil es mich nun auch interessiert, wie sowas besser mit reinen Shellwerkzeugen machbar ist. Mal sehen was diverse Gurus da so vorschlagen.

Gruß Wolfgang
 
Hallo
*lol*
Es geht tatsächlich auch mit der bash mit einem Einzeiler

Den Wald vor lauter Bäumen nicht sehend habe ich die hier sinnvolle Option -f von grep ganz übersehen.

grep -f Sort.Liste -v hauptliste >Resultat


:think: :think: 8)
Byby Wolfgang
 
Hallo Wolfgang,

Danke für deine hilfe.
Die option "-f" wird leider auch nicht unterstüzt, aber die lösung mit der "for" Schleife funktioniert super.
Sowas ähnliches hatte ich auch versucht, aber bei mir hat es nicht funktioniert.

Danke nochmal für deine mühe und hilfe !

mfg
Ghostrider
 
Ghostrider schrieb:
Hallo Wolfgang,

Danke für deine hilfe.
Die option "-f" wird leider auch nicht unterstüzt, aber die lösung mit der "for" Schleife funktioniert super.
Sowas ähnliches hatte ich auch versucht, aber bei mir hat es nicht funktioniert.

Danke nochmal für deine mühe und hilfe !

mfg
Ghostrider
Hallo
In was für einer Shell bist du eigentlich unterwegs?
Die Option -f bei grep ist auch als fgrep zu finden.
Freut mich aber trotzdem, wenn es so funktioniert.
Bedenke aber, dass die Sort-Liste in einem Rutsch in den Speicher geladen wird.
Wenn diese zu groß wird, ist es eventuell sinnvoll das auch noch als while read Schleife drumrum zu basteln, was dann aber bei jeder Zeile aus der Hauptliste die gesamte Datei sort.Liste einliest.
Das wird sehr langsam.
Methode zwei wäre also, die Datei ab einer bestimmten Größe zu teilen und das zweimal durchlaufen zu lassen, wobei result dann als Hauptliste und teil 2 der Sortliste als Sortliste benutzt würde.

Gruß Wolfgang
PS Interessiert mich wirklich, was das für ein System ist, wo kein perl und keine fgrep diff usw. zur Verfügung steht.
 
Zurück
Oben