CSV-Datei auslesen und Dateien zuordnen

B

Banana

Grünschnabel
Hallo Zusammen,

Meine Aufgabe ist es aus einer CSV-Datei bestimmte Zonen auszulesen und jeder Zone ein xml-File (von tausenden von Files) zuzuordnen.

Ich habe es schon soweit geschafft, dass ich die CSV-Datei auslesen kann und das Ergebnis in einer Text Datei abspeichere:


PHP:
awk -F';' '{print $5}' blubb.csv | grep '[^TimeBand]' | sort | uniq >Zone.txt;

Ich schaffe es auch jeder Zone ganz viele xml-Files zuzuorden:

PHP:
sed -n '1p' Zone.txt |grep -l $ *xml

Aber ich weiß leider nicht wie ich es anstellen soll, dass das Progamm aufhört, sobald es schon eine passende xml-Datei gefunden hat.

Kann mir vielleicht jemand einen Tipp geben??

Gruß Banana
 
zwei sachen:
  1. könntest du bitte beispiele posten. (csv beispiel mit der daraus resultierenden Zone.txt, beispiel output von dem grep befehl. ich hab n bissl schwierigkeiten mir das alles vorzustellen..)
  2. das hier:
    Code:
    grep '[^TimeBand]'
    macht eventuell nicht das, was du gerne willst.
    klick mich, ich bin ein link *:

zum "grep-problem", schau dir mal den "-m" switch an, vielleicht hilft der ja
 
Die Ausgabe von

PHP:
grep '[^TimeBand]'

ist

TB_P01-P
TB_P02-O

und dann habe ich noch jede menge xml-Files wo diese Zonen drinne vorkommen. Um die passenden Files zu jeder Zone zu bekommen verwende ich folgenden Befehl:

PHP:
sed -n '1p' Zone.txt |grep -l $ *xml

Nur leider spuckt der mir dadurch jede Menge Files aus, aber ich hätte gerne das er mir nur ein raussucht
 
könntest du bitte mal in worten sagen, was das hier machen soll?
Code:
sed -n '1p' Zone.txt |grep -l $ *xml

und das hier bitte auch:
Code:
grep '[^TimeBand]'

eine beispiel-antwort auf das zweite-code schnippselchen wäre:
ich will alle zeilen ausgeben lassen, die das wort "TimeBand" nicht enthalten.
...

und aus dem ersten code-schnippsel werde ich kein stück schlau, wäre nett wenn du das für mich ein wenig erläutern würdest. thx <3 (:

ps: was ist an der von mir vorgeschlagenen "-m" option faul, dass du sie nicht benutzen willst?
 
Ich habe gerade mal in der Info nach der Option -m geschaut.

Hab habe folgendes gefunden:


Wie kann ich das jetzt genau verwenden, hatte das folgendermaßen in meinen Befehl eingefügt:

sed -n '1p' Zone.txt |grep -m 1 -l $ *xml
aber das funktioniert so leider nicht.

Bekomme immer folgende Fehlermeldung ausgespuckt:

grep: illegal option -- m
Usage: grep -hblcnsviw pattern file . . .
0
 
naja, bei mir gehts. allerdings ist die m-option in verbindung mit der l-option doch nicht ganz so sinnvoll, wie ich mir das vorgestellt habe..
aber du könntest ja auch einfach von da an weiter in head pipen.
Code:
grep -l "suchwort" *| head -1
gibt dir nur die erste zeile zurück. könntest du btw trotzdem versuchen in worten zu sagen, was diese beiden befehle machen sollen?

Code:
sed -n '1p' Zone.txt |grep -l $ *xml
(??)

Code:
grep '[^TimeBand]'
...
 
Dies hier
sed -n '1p' Zone.txt |grep -l $ *xml
Soll aus der Zone.txt die erste Zeile auslesen (das wäre in diesem Fall TB_P01-P) und anschließend alle xml-Dateien nach diesem Suchmuster durchsuchen und nur der Dateiname soll ausgegeben werden.

Zu deiner zweiten Frage:
Deine Denkansatz war korrekt. TimeBand war nämlich die Überschrift und diese wollte ich nicht mit auslesen.
 
Soll aus der Zone.txt die erste Zeile auslesen (das wäre in diesem Fall TB_P01-P) und anschließend alle xml-Dateien nach diesem Suchmuster durchsuchen und nur der Dateiname soll ausgegeben werden.
habe ich befürchtet. wie kommst du auf die schreibweise mit dem dollarzeichen? das ist einmal der variablen-indikator der shell und einmal der "end of string" anchor von regex engines. und da es hier ja eine regex für grep darstellt, mätscht das ding dir da alles und jeden..
und das mit der pipe wird so nicht funktionieren: wenn du einen befehl in grep pipest, "durchsucht" grep diesen text und verwendet ihn nicht als suchmuster. so sollte das gehen:
Code:
sed -n '1p' Zone.txt > pattern.file
grep -f pattern.file *
oder, wenn die patterns strings und keine regexes sind (oder für grep sein sollen), nimm auch noch den "-F" switch:
Code:
sed -n '1p' Zone.txt > pattern.file
grep -Ff pattern.file *

und das mit dem pipen nach head hab ich ja schon gesagt, hm. ach genau:
Code:
grep '[^EinWort]'
so funktioniert das nicht, so schon:
Code:
grep -v 'EinWort'
dazu darfst du auch gerne noch mal mein erstes post ansehen.
 
@Banana
Du hast jetzt bereits zwei Threads hier erstellt, und dabei weiß Niemand hier worüber wir eigentlich reden.
Ist es denn wirklich so schwer, sich an die essentiellen Regeln zu halten?

Ich bin es leid, ständig nach OS und Shell zu fragen.
Diesen Hinweis habe ich nicht aus Spaß dort stehen.
GNU grep verhält sich z.B. ganz anders als grep aus Solaris.
C-Shell hat andere Syntax als Bash...
u.s.w.

Zum Thema.
Um mit sed nur die erste Zeile zu lesen:
Code:
sed -e '1q' input
zu den Regexp der Shell (ja von welcher denn?)
Code:
[^EGAL] -> ist eine Zeichenklasse der Buchstaben E,G,A,L egal in welcher Reihenfolge.
AGEL würde also auch matchen genauso wie GELA. Die Sysv konforme Negation ist eigentlich !.
Die Bash und ksh sowie GNU grep akzeptieren auch ^.

Zu der Pipe wurde schon genug gesagt.

Wolfgang
 

Ähnliche Themen

ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

Zurück
Oben