|
| Samle tekst filer i en. Fra : Heine Laursen |
Dato : 21-12-04 19:14 |
|
Hejsa
Mit problem er at jeg har en masse tekst filer som:
prefix0001.txt
prefix0002.txt
prefix0003.txt
....
Jeg har så en anden tekst fil (prefix-index.txt) der indeholder nogne
tids koder, og under hver enkelt tidskode står der det fulde navn på en
af disse tekst filer. eks på denne prefix-index.txt
1:
prefix0001.txt
2:
prefix0002.txt
3:
prefix0003.txt
....
Jeg vil så gerne have at indholdet af prefix0001.txt skal ind i
prefix-index.txt og overskrive linjen prefix0001.txt
Ind til vidre er jeg stødt på 2 problemer.
jeg kan ikke få sed til at tage imod 2 variabler
og jeg kan ikke få variablen $i til at indeholde 4 pladser.og stige
automatisk. eks 0001, 0002, 0003 osv!
Jeg har førsøgt mig med noget bash script men det duer ikke!
Hvordan kan jeg løse dette!
-- Script --
#!/bin/bash
i=0001
prefix=test
end=.txt
lastfile=0721
index=$prefix-index.txt
cp $index $index.backup
while [ "$i" != "$lastfile" ]
do
filnavn=$prefix$i$end
text=$(cat < $filnavn)
sed "s/$filenavn/$text/" $index >$index.new
mv -f $index.new $index
let "i=$i+1"
done
-- Script Slut --
--
Mvh
Heine Laursen
| |
Adam Sjøgren (21-12-2004)
| Kommentar Fra : Adam Sjøgren |
Dato : 21-12-04 19:35 |
|
On Tue, 21 Dec 2004 19:14:18 +0100, Heine wrote:
> Jeg vil så gerne have at indholdet af prefix0001.txt skal ind i
> prefix-index.txt og overskrive linjen prefix0001.txt
En måde er sådan her:
$ cat prefix-index.txt
1:
prefix0001.txt
2:
prefix0002.txt
3:
prefix0003.txt
$ cat prefix0001.txt
AAAAA
AAAAA
AAAAA
$ cat prefix0002.txt
BBBBB
$ cat prefix0003.txt
CC
CC
CC
CC
$ perl -pe 's!^(.*[.]txt)\n$!local $/; open FH, $1; $s=<FH>; close FH; $s;!e;' < prefix-index.txt
1:
AAAAA
AAAAA
AAAAA
2:
BBBBB
3:
CC
CC
CC
CC
$
Jeg forudsætter at de linier der indeholder tekst-filnavne slutter på
".txt", at de findes og kan læses, og at de ligger i den mappe du står
i (eller har fuld sti), og at filnavnene ikke starter med '>', '>>'
o.l.
Det kan sikkert gøres kortere/bedre/mere elegant/mere effektivt.
Mvh.
--
"I met a christian in Christiansands" Adam Sjøgren
A devil in Helsinki asjo@koldfront.dk
| |
Heine Laursen (21-12-2004)
| Kommentar Fra : Heine Laursen |
Dato : 21-12-04 21:13 |
|
On Tue, 21 Dec 2004 19:34:51 +0100, Adam Sjøgren wrote:
> On Tue, 21 Dec 2004 19:14:18 +0100, Heine wrote:
>
>> Jeg vil så gerne have at indholdet af prefix0001.txt skal ind i
>> prefix-index.txt og overskrive linjen prefix0001.txt
>
> En måde er sådan her:
>
> $ perl -pe 's!^(.*[.]txt)\n$!local $/; open FH, $1; $s=<FH>; close FH; $s;!e;' < prefix-index.txt
Fantastisk. Jeg forstår ingenting af overståënde, men det virker
perfekt.
Mange tak skal du have.
--
Mvh
Heine Laursen
| |
Peter Makholm (21-12-2004)
| Kommentar Fra : Peter Makholm |
Dato : 21-12-04 19:50 |
|
Heine Laursen <gozar@gozar.dynu.com> writes:
> Jeg har førsøgt mig med noget bash script men det duer ikke!
> Hvordan kan jeg løse dette!
Jeg tror det trick du mangler er at generere filnavnet med printf(1):
(Uprøvet og primært baseret på dit script)
#!/bin/sh
i=1
prefix=test
end=.txt
lastfile=721
index=$prefix-index.txt
# truncate index:
echo > $index
while [ "$i" != "$lastfile" ] do
filnavn=$(printf "%s%04d$s" $prefix $i $end)
echo $i: >> $index
cat $filnavn >> $index
i=$(($i + 1))
done
--
Peter Makholm | We constantly have to keep in mind why natural
peter@makholm.net | languages are good at what they're good at. And to
http://hacking.dk | never forget that Perl is a human language first,
| and a computer language second
| |
Heine Laursen (21-12-2004)
| Kommentar Fra : Heine Laursen |
Dato : 21-12-04 21:37 |
|
On Tue, 21 Dec 2004 19:50:01 +0100, Peter Makholm wrote:
> Heine Laursen <gozar@gozar.dynu.com> writes:
>
>> Jeg har førsøgt mig med noget bash script men det duer ikke!
>> Hvordan kan jeg løse dette!
>
> Jeg tror det trick du mangler er at generere filnavnet med printf(1):
>
> (Uprøvet og primært baseret på dit script)
>
> #!/bin/sh
>
> i=1
> prefix=test
> end=.txt
> lastfile=721
> index=$prefix-index.txt
>
> # truncate index:
> echo > $index
>
> while [ "$i" != "$lastfile" ] do
> filnavn=$(printf "%s%04d$s" $prefix $i $end)
Overstående linje skal være:
filnavn=$(printf "%s%04d%s" $prefix $i $end)
ellers spytter den filnavnene ud sådan her:
test0001.txt0000
> echo $i: >> $index
> cat $filnavn >> $index
> i=$(($i + 1))
> done
udover det, gør den præsist det jeg frygtede. Den erstatter tidskoderne
med 1: 2: 3: osv.
--
Mvh
Heine Laursen
| |
Lasse Hillerøe Peter~ (21-12-2004)
| Kommentar Fra : Lasse Hillerøe Peter~ |
Dato : 21-12-04 21:32 |
|
In article <pan.2004.12.21.18.14.09.217271@gozar.dynu.com>,
Heine Laursen <gozar@gozar.dynu.com> wrote:
> Jeg har førsøgt mig med noget bash script men det duer ikke!
> Hvordan kan jeg løse dette!
Hvad med:
<prefix-index.txt (while read l ; do test -f $l && cat $l || echo $l ;
done) >output.txt
--
Lasse Hillerøe Petersen | "I met someone who looks a lot like you,
----------------------------+ she does the things you do;
No Windows | but she is an IBM"
= No virus | (Jeff Lynne, "Yours truly 2095")
| |
Adam Sjøgren (21-12-2004)
| Kommentar Fra : Adam Sjøgren |
Dato : 21-12-04 22:01 |
|
On Tue, 21 Dec 2004 21:12:33 +0100, Heine wrote:
>> $ perl -pe 's!^(.*[.]txt)\n$!local $/; open FH, $1; $s=<FH>; close
>> FH; $s;!e;' < prefix-index.txt
> Fantastisk. Jeg forstår ingenting af overståënde, men det virker
> perfekt.
Det er ret simpelt, egentlig:
perl -pe
Start perl, kør den efterfølgende streng som perl-programkode for hver
linie i inddata, og skriv resultatet/linien ud.
Det følgende udføres altså for hver linie i inddata:
s!^(.*[.]txt)\n$!
Se om linien passer ind i mønstret "hvadsomhelst punktum txt
linieskift". Hvis det gør, så udskift linien med resultatet af denne
perl-snip:
local $/; open FH, $1; $s=<FH>; close FH; $s;
Ovenstående er vel nærmest en standard-"vending" i perl til at læse en
fils indhold ind i en variabel. Jeg skriver variablens navn til sidst,
for at få snippen til at returnere variablens indhold, altså filens
indhold.
!e;
Endelig er det 'e'-et til sidst, der fortæller perl at det filnavnet
skal udskiftes med ikke er tekst, men en snip perl der skal udføres.
Hvis inddata-linien ikke passer i mønstret, så skrives linien uændret
ud (der er derfor 1:, 2: osv. kommer ud).
Nå, det blev vist lidt perl-specifikt, så jeg sætter videre diskussion
til at foregå i dk.edb.programmering.perl.
Mvh.
Adam
--
"This is either madness... or brilliance." Adam Sjøgren
"It's remarkable how often those two traits coincide." asjo@koldfront.dk
| |
|
|