myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Bash Shell Zeilenweise auslesen (https://mygully.com/showthread.php?t=2910029)

struchli 25.04.13 10:15

Bash Shell Zeilenweise auslesen
 
Hallo Zusammen

Ich habe folgendes Problem:
Ich möchte eine Datei zeilenweise auslesen und jede Zeile als Pattern für grep verwenden. Die Resultate möchte ich dann in ein File schreiben.
Für das Zeilenweise Auslesen einer Datei habe ich schon etwas gefunden. Leider funktioniert es nicht wie gewünscht.
Code:

#!/bin/bash
#exec 2>&1
#set -vx
#PS4='[nsc: 19]+ '
#export PS4
for line in `cat /tmp/Organisation.txt`;do
    grep $line /tmp/MIT_TMP.tmp >> /tmp/MIT_ALL_DATE.txt
done

Den grep-Befehlt funktioniert so, wenn er nicht im S***** steht. Auch das zeilenweise Auslesen habe ich mit einem echo $line getestet und funktioniert einwandfrei.
Wenn ich das S***** ausführe, läuft es unendlich lange, macht aber gar nichts.
Die Datei Organisation.txt hat ca. 6000 Zeilen und auf jeder Zeile steht eine Nummer.
Die Datei MIT_TMP.tmp hat ca. 10'000'000 Zeilen.
Das System ist AIX.

Kann mir jemand weiterhelfen?

Vielen Dank für die Hilfe Gruss struchli

spartan-b292 25.04.13 11:37

Mit awk als netter Einzeiler:

PHP-Code:

awk '{ print $0}' Quelle grep WasDuGrepenWillst >> Ziel 


struchli 25.04.13 11:58

Zitat:

Zitat von spartan-b292 (Beitrag 24516969)
Mit awk als netter Einzeiler:

PHP-Code:

awk '{ print $0}' Quelle grep WasDuGrepenWillst >> Ziel 


So funktioniert das leider nicht. Ich habe es vielleicht nicht genau genug erklärt.

In der Datei Organisation.txt hat es ca. 6'000 Zeilen auf jeder Zeile steht eine Nummer (z.B. 4003755846) diese Nummer wiederum ist irgendwo in der Datei MIT_TMP.tmp vorhanden. Die Zeile, auf der diese Nummer vorkommt, möchte ich in eine Datei schreiben.

Der grep-Befehl, der in meinem S***** steht, funktioniert auch super, wenn ich ihn auf der promt eingebe mit einer beliebigen Nummer.

Trozdem vielen Dank für deine Mühe

spartan-b292 25.04.13 12:06

Ich verstehs immer noch nicht. Kannst du vllt mal ein Beispiel geben, mit Auszügen aus den Dateien?

struchli 25.04.13 12:13

Zitat:

Zitat von spartan-b292 (Beitrag 24517007)
Ich verstehs immer noch nicht. Kannst du vllt mal ein Beispiel geben, mit Auszügen aus den Dateien?

Ja sicher ;)

Also in der Datei Organisation.txt steht zum Beispiel auf Zeile eins die Nummer 4003628505
In der Datei MIT_TMP.tmp kommt irgendwo eine Zeile vorhanden, auf der diese Nummer vorkommt:

12-40036285050002012Firma Coop Mercato Resega via Sonvico 5 007159837 695200Canobbio CH

Das S***** soll nun, die 6000 Nummern der Datei Organisation.txt in der Datei MIT_TMP.tmp finden und die betreffende Zeile in eine neue Datei schreiben.

Ist es jetzt verständlich?

Gruss und Danke struchli

spartan-b292 25.04.13 12:44

Ja viel Besser!

Zitat:

#!/usr/bin/env bash

for line in `cat organisation.txt`;do
grep .*$line.* mit_tmp.txt >> ausgabe.txt
done
Dateinamen musst du noch entsprechend anpassen.

Ich habe das mal mit dem von dir gegebenen Beispiel nachgebaut. Funktionert bei mir. Das du mit der grep anweisung nicht die Zeilen findest,liegt daran, dass die Zeilen die du suchst die eingelesene Nummer ja mitten in einem String haben. Deshalb mussten da noch ein paar regex ausdrücke hin.

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

struchli 25.04.13 13:07

Vielen Dank für deine Hilfe spartan-b292 es liegte am System, habe nun halt alle Dateien und das S***** auf eine Linux-Maschine verschoben. Da funktioniert es einwandfrei!!


Zitat:

Zitat von spartan-b292 (Beitrag 24517099)
Ja viel Besser!



Dateinamen musst du noch entsprechend anpassen.

Ich habe das mal mit dem von dir gegebenen Beispiel nachgebaut. Funktionert bei mir. Das du mit der grep anweisung nicht die Zeilen findest,liegt daran, dass die Zeilen die du suchst die eingelesene Nummer ja mitten in einem String haben. Deshalb mussten da noch ein paar regex ausdrücke hin.

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Ich weiss nicht, was ich falsch mache. Kann es am System liegen (bei mir AIX)?

Code:

blablabla@blablabla:/tmp:./mit_druck_s*****.sh
4003629533

Mein S*****:

PHP-Code:

#!/bin/bash
#exec 2>&1
#set -vx
#PS4='[nsc: 19]+ '
#export PS4
for line in `cat Organisation.txt`;do
echo 
$line
   grep 
.*$line*. MIT_TMP.tmp >> MIT_ALL_DATE.txt
done 

bei echo $line bekomme ich auch die erste Nummer aber dann macht er nicht mehr weiter (schreibt auch nichts in die Datei MIT_ALL_DATE.txt). Berechtigungen habe ich genug.

spartan-b292 25.04.13 13:14

Versuchs mal mit grep -E '.*$line.*'

Ich habe kein AIX zur Verfügung deshalb vllt heir nochmal gucken:

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

struchli 25.04.13 13:15

Zitat:

Zitat von spartan-b292 (Beitrag 24517193)
Versuchs mal mit grep -E '.*$line.*'

Ich habe kein AIX zur Verfügung deshalb vllt heir nochmal gucken:

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Vielen vielen Dank für deine Hilfe. Es hat tatsächlich am System gelegen.

spartan-b292 25.04.13 13:18

Sehr schön.

Du könntest noch ausprobieren ob du auch mit fgrep (kennt weniger regex, ist aber schneller) auskommst. Das könnte das S***** beschleunigen da 6000 Einträge doch schon etwas mehr sind.

struchli 25.04.13 13:33

Zitat:

Zitat von spartan-b292 (Beitrag 24517202)
Sehr schön.

Du könntest noch ausprobieren ob du auch mit fgrep (kennt weniger regex, ist aber schneller) auskommst. Das könnte das S***** beschleunigen da 6000 Einträge doch schon etwas mehr sind.

Ja stimmt mit dem fgrep ist er schneller :-)
Vielen vielen Dank ;-)
Gruss struchli


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.