|
Chibi
Anmeldungsdatum: Jan. 14, 2012
Beiträge: 8
|

9. Februar 2012 09:21
Hi, ich bastel grad an nem script und häng da ein wenig fest. Ich habe 2 Dateien und will die mit paste zusammenführen. Jetzt ist bei mir das kurioses aufgetreten, dass unter Cygwin auf einem Windows 7 System, der Befehl anscheinend wie gewünscht schön funktioniert. Und zwar so:
| Datei A:
bla bla bla
bla bla bla
Datei B:
blub blub blub
blub blub blub
Datei C:
bla bla bla blub blub blub
bla bla bla blub blub blub
|
Sobald ich das script aber unter Ubuntu laufen lasse, passiert das
| Datei C:
bla bla bla
blub blub blub
bla bla bla
blub blub blub
|
Also er zieht das, was er anhängen soll jeweils in eine neue Zeile und das ist ja so nicht richtig.
So ganz megaviele Optionen gibs ja nicht für paste. Vlt die Zeilenlänge zu lang? Gibs sowas?
Jemand eine Idee wieso dass so ist oder wie ich das wegbekomme. Laufen muss das Script von mir dann unter Linux MFG Chibi
|
|
rklm
Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 914
|

9. Februar 2012 09:29
Hast Du dieselben Dateien verwendet? Dann könnte es an DOS/UNIX-Zeilenendungen liegen. dos2unix verschafft Abhilfe. Ciao robert
|
|
Chibi
(Themenstarter)
Anmeldungsdatum: Jan. 14, 2012
Beiträge: 8
|

9. Februar 2012 10:05
Perfekt, genau das wars! Vielen Dank
|
|
Chibi
(Themenstarter)
Anmeldungsdatum: Jan. 14, 2012
Beiträge: 8
|

10. Februar 2012 00:32
Hallo, noch mal sone tricky Frage. hab hier n UbuntuSystem und lass per Schleife eine Liste durchgehen und das Ergebniss jeden Schleifensurchgangs ist das Suchmuster für einen grep-Befehl | for i in $(< liste) ;
do
fgrep -w "$i" mainfile | ... | >> output ;
done
|
soweit so gut, funktioniert fantastisch. Auch auf dem genannten Windows-System mit Cygwin. Jetzt habe ich das mal auf nen anderen Linux-System ausprobiert ( wobei unter cat /proc/version nur das zu stehen hab
Linux version 2.6.35.8.x86_64.55 (gcc version 4.4.2 (GCC) ) #1 SMP PREEMPT Sun Nov 7 04:16:19 CET 2010 ) und der Befehl funktioniert nicht mehr . der Schalter -w hat keine Funktion mehr. Er matcht jetzt die dummem Substrings mit. Also ich suche nach 123 und er gibt mir
aus. Öhm, bin da ein wenig ratlos. Hat da vlt jemand n Tipp woran das liegen könnte? MFG Chibi
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 3769
Wohnort: Wolfen (S-A)
|

10. Februar 2012 01:00
Was hast Du genau für Daten ? Denn Dein Beispiel mit der "123" funktioniert bei mir bestens:
track@lucid:~$ echo '123
1234
12345
123456' | fgrep -w '123'
123 Vielleicht solltest Du den Inhalt der Suchvariablen $i und des mainfile einmal mit hd genauer ansehen ? Und: was gibt auf Deinem komischen System fgrep --version aus ? Edit: Und schließlich könntest Du die Auswahl ja auch mit einem ganz normalen grep-Befehl mit Wortankern erledigen:
grep '\<123\>' track
|
|
Chibi
(Themenstarter)
Anmeldungsdatum: Jan. 14, 2012
Beiträge: 8
|

10. Februar 2012 01:05
soweit so gut, funktioniert fantastisch
bei 2 Systemen habe ich auch keine Probleme, wie gesagt. Ich weiss ja auch nicht was das soll auf diesem anderen Linux-System.
Was genau meinst du mit hd genauer ansehen. Unter man hd bin ich nicht schlau geworden. Die Daten sind eine sehr große Tabelle mit vielen Zeilen und Spalten. Und ich grep quasi nach der 1.Spalte den Namen.
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 3769
Wohnort: Wolfen (S-A)
|

10. Februar 2012 01:14
Mit hd bekommst Du einen Hex-Dump, da siehst Du jedes noch so verborgene Sonderzeichen. Aber, Du hast noch nichts zu fgrep --version verraten ... Und dann hatte ich noch einen Vorschlag mit Wortankern dazu editiert. track
|
|
Chibi
(Themenstarter)
Anmeldungsdatum: Jan. 14, 2012
Beiträge: 8
|

10. Februar 2012 01:29
System wo es nicht geht grep 2.5.1
System wo es geht grep 2.6.3 Mit den Ankern scheint es nicht mit dem Inhalt von Variablen zu gehen, ansonsten gehts, wenn ich ihm so das suchmuster mitgebe.
Da könnte ich aber auch grep -w machen. Aber dann gehen die sonderzeichen nicht, die manchmal im Namen vorhanden sind (123*0 z.B.)
Deswegen müsste es irgendwie mit fgrep gehen. Oder vlt ein ganz anderer Ansatz.
Wie genau wende ich das mit hd an. Bekomms grad nicht hin.
|
|
track
Anmeldungsdatum: Juni 26, 2008
Beiträge: 3769
Wohnort: Wolfen (S-A)
|

10. Februar 2012 03:20
Wenn Du z.B genau sehen willst, welche Bytes in der Variablen $var stecken, dann kannst Du sie per Pipe an hd weiterleiten:
echo "$var" | hd Mit den Ankern scheint es nicht mit dem Inhalt von Variablen zu gehen, ....
Wieso nicht ? Das hat mit Variablen nichts zu tun. Bei mir geht's:
track@lucid:~$ var="123"
track@lucid:~$ echo '123
> 1234
> 12345
> 123456' | grep "\<$var\>"
123 Allerdings müssten die speziellen Zeichen maskiert werden, wenn Du mit Regulären Ausdrücken suchst, das stimmt. Eigentlich sollte GNU grep 2.5.1 die Option -w kennen: http://rpm.pbone.net/index.php3/stat/45/idpl/659448/numer/1/nazwa/grep aber Du kannst ja nochmal mit fgrep --help auf dem seltsamen System gucken, was er selber sagt. Ist das womöglich gar kein GNU grep ? track
|
|
rklm
Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 914
|

10. Februar 2012 07:52
Chibi schrieb: | for i in $(< liste) ;
do
fgrep -w "$i" mainfile | ... | >> output ;
done
|
Es ist effizienter, wenn Du "output" nur einmal öffnest: | for i in $(< liste) ;
do
fgrep -w "$i" mainfile | ...
done > output
|
oder wenn Du es selektiver brauchst: | exec 3>output
for i in $(< liste) ;
do
fgrep -w "$i" mainfile | ... >&3
done
exec 3>&-
|
Aber Du kannst Dir die Sache auch noch einfacher machen | fgrep -wf liste mainfile | ... | > output
|
Zu Deinem eigentlichen Problem: wie kopierst Du "liste" auf das Windows-System und wie hast Du da cygwin installiert? Könnte sein, dass Du auf der Windose \r\n als Zeilentrenner hast, was Dir dann u.U. die Suchmuster verhagelt. Ciao robert
|
|
Chibi
(Themenstarter)
Anmeldungsdatum: Jan. 14, 2012
Beiträge: 8
|

10. Februar 2012 17:37
Hi, vielen vielen Dank für die ganze Mühe.
Ich habe jetzt rausgefunden, dass es tatsächlich an einer alten Version von grep lag!
Hab die Sysadmins mal gebeten das upzudaten und siehe da: So klappt es auch mit dem Nachbarn  grep 2.5.1 kann den Befehl nicht --> fgrep -w "$i" mainfile | ... grep 2.6.3 kann ihn. Und zwar geht es sogar nichtmal um das -w wie ich zuerst dachte, sondern um die "" um die Variable womit das alte grep nicht ganz klar kommt! Also vielen Dank. Das mit dos2unix klappt wunderbar, jetzt stimmt auch die Formatierung und endlich geht auch der grep-Befehl so wie er soll.
Ich werd jetzt nochmal die letzten Tipps von rklm probieren. Dankende Grüße
Chibi
|
|
rklm
Supporter
Anmeldungsdatum: Okt. 16, 2011
Beiträge: 914
|

10. Februar 2012 23:57
Chibi schrieb: Hi, vielen vielen Dank für die ganze Mühe.
Gerne.
Ich habe jetzt rausgefunden, dass es tatsächlich an einer alten Version von grep lag!
Nach dem, was Du weiter unten schreibst, wäre ich mir da nicht so sicher.
Hab die Sysadmins mal gebeten das upzudaten und siehe da: So klappt es auch mit dem Nachbarn  grep 2.5.1 kann den Befehl nicht --> fgrep -w "$i" mainfile | ... grep 2.6.3 kann ihn. Und zwar geht es sogar nichtmal um das -w wie ich zuerst dachte, sondern um die "" um die Variable womit das alte grep nicht ganz klar kommt!
Das kann nicht sein! Der fgrep sieht die Quotes gar nicht, das macht alles die Shell beim Aufruf. Dein nächster Satz scheint mir eher die Ursache zu beschreiben:
Also vielen Dank. Das mit dos2unix klappt wunderbar, jetzt stimmt auch die Formatierung und endlich geht auch der grep-Befehl so wie er soll.
Ich vermute eher, dass es an der Musterdatei lag (z.B. DOS-Zeilenenden, Whitespace am Ende von Zeilen). Bist Du mal dem Rat gefolgt und hast Dir die Musterdatei mit hd oder od -t c angeschaut?
Ich werd jetzt nochmal die letzten Tipps von rklm probieren.
Ich vergaß noch zu erwähnen, dass der Ansatz mit "-f musterdatei" außerdem effizienter ist als die for-Schleife, weil bei der Schleife die Eingabe so oft durchsucht wird, wie es Muster in der Datei gibt, während mit -f nur einmal durch die Eingabe gesucht wird. Ciao robert
|