Hallo,
mein Problem, in einem Verzeichnis sind viele Dateien zu einer Datei zusammenzufassen. Beispiel des simplen Befehls:
cat A.txt >> alles.txt
cat B.txt >> alles.txt
usw.
Ich habe versucht, mit meinen mageren Linux-Kenntnissen ein Shell-Script zu erstellen, dass die Zeilen nacheinander mit vielen Dateien verarbeitet. Aber leider sind meine Kenntnisse hierfür zu mager. Habt Ihr einen einfachen Lösungsansatz?
Im Idealfall soll nur ein jeweils bestimmter (per gleichbleibenden Anfangs- und Ende-String definierbarer) Teil aus den Dateien A.txt, B.txt usw. in die Datei alles.txt übernommen werden. Aber dies heißt wohl nach den Sternen greifen. Eine derartige definierbare Lösung in Perl oder PHP wäre mir allerdings auch 20EUR wert.
Danke
gerd
Textdateien (bzw. Bestandteile davon) in eine Datei packen
Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen
gib' nicht zu viel Geld aus ;)
Shell simpel:
Damit hast Du alle Dateien in eine Ausgabedatei ${ausgabedatei} hineingepumpt, solltest allerdings darauf achten, dass sich die Ausgabedatei in einerm anderen Verzeichnis befindet weil Du sonst in eine Endlosschleife gerätst.
Damit hast Du übrigens auch schon das Grundgerüst für Perl und PHP :D
Jetzt müsste nur noch Deine Anforderung nach der Ausgabe von Teilen der Datei eingebaut werden - hast Du eine Beispieldatei wo man sehen könnte, wie der Text aufgebaut ist?
Zwischenzeitlich kannst Du Dich ja auch mal mit dem awk auseinandersetzen ... *g*
Shell simpel:
Code: Select all
for datei in $(ls ${verzeichnis}) do
cat ${datei} >> ${ausgabedatei}
doneDamit hast Du übrigens auch schon das Grundgerüst für Perl und PHP :D
Jetzt müsste nur noch Deine Anforderung nach der Ausgabe von Teilen der Datei eingebaut werden - hast Du eine Beispieldatei wo man sehen könnte, wie der Text aufgebaut ist?
Zwischenzeitlich kannst Du Dich ja auch mal mit dem awk auseinandersetzen ... *g*
Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen
Doch. Wenn ich eine automatisierte Lösung bekomme, soll das Dankeschön auch fließen. Ich muss allerdings gestehen. Ich brauche nicht nur abstrakt den Hinweis, sondern den vollständigen Code. So habe ich mit der Umsetzung des abstrakten Hinweises zu deiner "Shell simpel" noch echte Probleme. So weiß ich nicht, ob bei verzeichnis und ausgabedatei der gesamte Pfad .../web1/html/... genommen werden muss und ob ich irgendetwas für datei einstellen muss. Sorry, meine Kenntnisse sind sehr mager. Nur leichte Trial&Error-Perl-Kenntnisse.
Zur Ausgabe von Teilen der Datei:
Die Dateien sind recht groß (mehrere Bildschirmseiten) aber die "Trennstrings" stehen fest und sind nur einmalig vorhanden. Es soll alles herausgenommen ab:
Beginn:
<tr class=color
bis
Ende:
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"> </font></td>
D.h. nimm aus den Dateien eines Verzeichnisses ab
<tr class=color
einschließlich des Beginn-Strings "<tr class=color" die folgenden Zeilen, bis zu dem Ende-String
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"> </font></td>
Der Ende-String sollte möglichst nicht in die "alles.txt" eingestellt werden. Wäre aber auch kein Problem, weil ich dann einfach diesen String durch nichts ersetzen würde.
Bei Bedarf stelle ich aber eine oder mehrere Beispielsdateien online.
Danke einstweilen.
Zur Ausgabe von Teilen der Datei:
Die Dateien sind recht groß (mehrere Bildschirmseiten) aber die "Trennstrings" stehen fest und sind nur einmalig vorhanden. Es soll alles herausgenommen ab:
Beginn:
<tr class=color
bis
Ende:
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"> </font></td>
D.h. nimm aus den Dateien eines Verzeichnisses ab
<tr class=color
einschließlich des Beginn-Strings "<tr class=color" die folgenden Zeilen, bis zu dem Ende-String
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"> </font></td>
Der Ende-String sollte möglichst nicht in die "alles.txt" eingestellt werden. Wäre aber auch kein Problem, weil ich dann einfach diesen String durch nichts ersetzen würde.
Bei Bedarf stelle ich aber eine oder mehrere Beispielsdateien online.
Danke einstweilen.
Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen
Code: Select all
#!/usr/bin/perl -w
#
# merge.pl - Script zum Zusammenfassen von Dateiabschnitten ein eine Datei hinein
#
# R.Schulze, 21.4.2003
use strict;
my $OUTFILE="alles.txt";
my $REC_START="<!--START-->";
my $REC_END="<!--END-->";
###############################################################################
opendir(DIR,"./") || die ("Konnte das Verzeichnis nicht oeffnen");
while(my $Entry=readdir(DIR))
{
next if (($Entry=~m/^(.{1,2})$/) || (!-f "./$Entry") || ($Entry eq "merge.pl"));
next if ($Entry eq $OUTFILE);
print "> Datei "$Entry" wird bearbeitet... ";
if(!-r "./$Entry")
{
print "Datei nicht lesbar.n";
next;
}
my $Extract=&ExtractFromFile("./$Entry");
if($Extract)
{
&AppendToIndex($Extract);
}
print "n";
}
exit(0);
###############################################################################
# ExtractFromFile
# extrahiert aus einen bestimmten Teil aus einer Datei
###############################################################################
sub ExtractFromFile
{
my $Filename=shift;
local $/;
open(FH,$Filename);
flock(FH,1);
my $Content=<FH>;
close(FH);
if($Content=~m/$REC_START((?:(?!$REC_END).)*)$REC_END/s)
{
print "[Extrakt gefunden]";
return $1;
}
return;
}
###############################################################################
# AppendToIndex
# fuegt einen String ans Ende einer Sammeldatei an
###############################################################################
sub AppendToIndex
{
my $Str=shift;
open(FH,">>$OUTFILE") || die ("Konnte die Datei "$OUTFILE" nicht zum Anhaengen oeffnen.");
flock(FH,2);
print FH $Str;
close(FH);
print "[An Index "$OUTFILE" gehaengt]";
return 1;
}
Die Ausgabedatei ist in der Konstanten $OUTFILE einstellbar.
Viel Spaß :)
Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen
Jau - die Perl-chen, die können das :)
Perl ist genau die richtige Sprache für sowas, weil sie (ursprünglich) auf genau solche Aufgaben gemünzt war :) Ich pers. hätte das jetzt mit dem sed veranstaltet (geht auch, ist dann aber nicht mehr so gut lesbar wie das Perl-Skript) aber wen rob so schnell ist ... :)
Ein Anmerkung noch:
Dir fallen bestimmt die Default-Werte für $REC_START und $REC_END auf, wenn es Dir möglich ist, würde ich Dir wärmstens an's Herz legen, zukünftig solche einfachen und eindeutigen Zeichenketten zur Markierung zu verwenden. Damit machst Du Dir auch später das Leben einfacher (Orientierung im Code, Suchen/Ersetzen, etc.).
Perl ist genau die richtige Sprache für sowas, weil sie (ursprünglich) auf genau solche Aufgaben gemünzt war :) Ich pers. hätte das jetzt mit dem sed veranstaltet (geht auch, ist dann aber nicht mehr so gut lesbar wie das Perl-Skript) aber wen rob so schnell ist ... :)
Ein Anmerkung noch:
Dir fallen bestimmt die Default-Werte für $REC_START und $REC_END auf, wenn es Dir möglich ist, würde ich Dir wärmstens an's Herz legen, zukünftig solche einfachen und eindeutigen Zeichenketten zur Markierung zu verwenden. Damit machst Du Dir auch später das Leben einfacher (Orientierung im Code, Suchen/Ersetzen, etc.).