/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
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

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408934
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste