/ 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
Noget shell-noget
Fra : Thomas Lindgaard


Dato : 26-03-04 14:56

Hejsa

Er der ikke en eller flere der kan hjælpe mig med at gøre følgende i en
shell (bash):

Slet alle linier i fil1 som også forekommer i fil2

Jeg har ikke så mange ideer til hvordan det kan gøres...

Mvh.
/Thomas

 
 
Martin Moller Peders~ (26-03-2004)
Kommentar
Fra : Martin Moller Peders~


Dato : 26-03-04 17:23

In <pan.2004.03.26.13.56.25.254982@it-snedkeren.BLACK_HOLE.dk> Thomas Lindgaard <thomas@it-snedkeren.BLACK_HOLE.dk> writes:

>Hejsa

>Er der ikke en eller flere der kan hjælpe mig med at gøre følgende i en
>shell (bash):

> Slet alle linier i fil1 som også forekommer i fil2

>Jeg har ikke så mange ideer til hvordan det kan gøres...

Flg. perl-script outputter din nye fil1.

#!/usr/bin/perl -w

open(F1,"<fil2.txt") or die "Kan ikke aabne fil2.txt";
open(F2,"<fil1.txt") or die "Kan ikke aabne fil1.txt";

while (<F1>) {
$at_huske{$_}='dummy';
}

while (<F2>) {
print if (!(defined($at_huske{$_})));
}

close(F1);
close(F2);


Thomas Lindgaard (27-03-2004)
Kommentar
Fra : Thomas Lindgaard


Dato : 27-03-04 22:15

On Fri, 26 Mar 2004 16:22:32 +0000, Martin Moller Pedersen wrote:

> Flg. perl-script outputter din nye fil1.
>
> #!/usr/bin/perl -w
>
> open(F1,"<fil2.txt") or die "Kan ikke aabne fil2.txt";
> open(F2,"<fil1.txt") or die "Kan ikke aabne fil1.txt";
>
> while (<F1>) {
> $at_huske{$_}='dummy';
> }
>
> while (<F2>) {
> print if (!(defined($at_huske{$_})));
> }
>
> close(F1);
> close(F2);

Hej alle og tak for svarene

Det bliver vist denne her der vinder, for det lyder ikke som om
cat-metoden fungerer og comm-metoden kræver jo en sortering hvilket jeg
gerne vil undgå...

Men det kan være at jeg lige oversætter til PHP - det er resten af koden
nemlig skrevet i :)

Mvh.
/Thomas

Jesper Louis Anderse~ (26-03-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 26-03-04 17:22

Thomas Lindgaard <thomas@it-snedkeren.black_hole.dk> wrote:
> Hejsa
>
> Er der ikke en eller flere der kan hj?lpe mig med at g?re f?lgende i en
> shell (bash):
>
> Slet alle linier i fil1 som ogs? forekommer i fil2
>
> Jeg har ikke s? mange ideer til hvordan det kan g?res...

Hvis data godt maa sorteres:

comm(1)

--
j.

Sv-E Madsen (27-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 27-03-04 08:24

Thomas Lindgaard wrote:

> Hejsa
>
> Er der ikke en eller flere der kan hjælpe mig med at gøre følgende i en
> shell (bash):
>
> Slet alle linier i fil1 som også forekommer i fil2
>
> Jeg har ikke så mange ideer til hvordan det kan gøres...
>
> Mvh.
> /Thomas
Hej
Hvis du vil bruge ren bash kan du gøre dette:
<SNIP>
cat fil1 fil2|uniq>fil1
</SNIP>
Hvis du ønsker at beholde din originale fil1, kan du jo bare pipe ud til et
andet filnavn.

--
/Sv-E
Fjern sneglen ved direkte svar

Peter Makholm (27-03-2004)
Kommentar
Fra : Peter Makholm


Dato : 27-03-04 09:52

Sv-E Madsen <sv-erik@snailstofanet.dk> writes:

> > Slet alle linier i fil1 som også forekommer i fil2

> Hvis du vil bruge ren bash kan du gøre dette:
> <SNIP>
> cat fil1 fil2|uniq>fil1
> </SNIP>

Ja, men det vil ikke have den ønskede effekt.

Uniq skriver helt simplet bare en linje ud hvis den er forekommet
umidelbart før:

plugh% cat > uniq.in
foo
bar
baz
foo
bar
baz
foo
bar
baz
plugh% uniq uniq.in
foo
bar
baz
foo
bar
baz
foo
bar
baz
plugh%

Der er ikke meget unikt over det med mindre filen er sorteret på
forhånd. I dit tilfælde vil uniq heller ikke kunne kende fil1 fra
fil2, hvilket vil være essentielt for at løse opgaven.

(Og så kan man overveje hvorfor et shell-script der bruger uniq er
mere 'ren bash' end et der bruger perl).

--
Peter Makholm | I have no caps-lock but I must scream...
peter@makholm.net | -- Greg
http://hacking.dk |

Sv-E Madsen (27-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 27-03-04 11:09

Peter Makholm wrote:

> Sv-E Madsen <sv-erik@snailstofanet.dk> writes:
>
>> > Slet alle linier i fil1 som også forekommer i fil2
>
>> Hvis du vil bruge ren bash kan du gøre dette:
>> <SNIP>
>> cat fil1 fil2|uniq>fil1
>> </SNIP>
>
> Ja, men det vil ikke have den ønskede effekt.
>
> Uniq skriver helt simplet bare en linje ud hvis den er forekommet
> umidelbart før:
>
> plugh% cat > uniq.in
> foo
> bar
> baz
> foo
> bar
> baz
> foo
> bar
> baz
> plugh% uniq uniq.in
> foo
> bar
> baz
> foo
> bar
> baz
> foo
> bar
> baz
> plugh%
>
> Der er ikke meget unikt over det med mindre filen er sorteret på
> forhånd. I dit tilfælde vil uniq heller ikke kunne kende fil1 fra
> fil2, hvilket vil være essentielt for at løse opgaven.
>
> (Og så kan man overveje hvorfor et shell-script der bruger uniq er
> mere 'ren bash' end et der bruger perl).
>
Jamen det har du da ret i, havde prøvet med to simple filer:
sem@DebIBM/testit$ cat fil1 fil2
et
to
tre
tre
fire
fem
sem@DebIBM/testit$ cat fil1 fil2|uniq
et
to
tre
fire
fem
sem@DebIBM/testit$
--
/Sv-E
Fjern sneglen ved direkte svar

Peter Makholm (27-03-2004)
Kommentar
Fra : Peter Makholm


Dato : 27-03-04 11:32

Sv-E Madsen <sv-erik@snailstofanet.dk> writes:

> Jamen det har du da ret i, havde prøvet med to simple filer:
> sem@DebIBM/testit$ cat fil1 fil2

Hvordan ser du (og uniq) hvilke linjer der komer fra hvilke filer?

--
Peter Makholm | According to the hacker ethic, the meaning of life
peter@makholm.net | is not Friday, but it is not Sunday either
http://hacking.dk | -- Peeka Himanen

Sv-E Madsen (27-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 27-03-04 14:27

Peter Makholm wrote:

> Sv-E Madsen <sv-erik@snailstofanet.dk> writes:
>
>> Jamen det har du da ret i, havde prøvet med to simple filer:
>> sem@DebIBM/testit$ cat fil1 fil2
>
> Hvordan ser du (og uniq) hvilke linjer der komer fra hvilke filer?
>
Her er vist tale om en misforståelse, dette output var jo bare et forsøg på
at vise hvad der var i fil1 og fil2, inden kommandoen cat fil1 fil2|uniq
blev kørt.
--
/Sv-E
Fjern sneglen ved direkte svar

Sv-E Madsen (27-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 27-03-04 14:29

Sv-E Madsen wrote:

> Peter Makholm wrote:
>
>> Sv-E Madsen <sv-erik@snailstofanet.dk> writes:
>>
>>> Jamen det har du da ret i, havde prøvet med to simple filer:
>>> sem@DebIBM/testit$ cat fil1 fil2
>>
>> Hvordan ser du (og uniq) hvilke linjer der komer fra hvilke filer?
>>
> Her er vist tale om en misforståelse, dette output var jo bare et forsøg
> på at vise hvad der var i fil1 og fil2, inden kommandoen cat fil1
> fil2|uniq blev kørt.
Arrggg
sem@DebIBM/testit$ cat fil1
et
to
tre
sem@DebIBM/testit$ cat fil2
tre
fire
fem
sem@DebIBM/testit$

--
/Sv-E
Fjern sneglen ved direkte svar

Peter Makholm (27-03-2004)
Kommentar
Fra : Peter Makholm


Dato : 27-03-04 14:31

Sv-E Madsen <sv-erik@snailstofanet.dk> writes:

> Her er vist tale om en misforståelse, dette output var jo bare et forsøg på
> at vise hvad der var i fil1 og fil2, inden kommandoen cat fil1 fil2|uniq
> blev kørt.

Er vi enige om at opgaven kræver at man kan se forskel på en linje i
fil1 og en linje i fil2?

Er vi enige om at vi ikke kan se forskel i 'cat fil1 fil2' og at
uniq(1) ikke kan se forskel i 'cat fil1 fil2 | uniq'?

--
Peter Makholm | There are 10 kinds of people. Those who count in
peter@makholm.net | binary and those who don't
http://hacking.dk |

Sv-E Madsen (27-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 27-03-04 14:50

Peter Makholm wrote:
> Er vi enige om at opgaven kræver at man kan se forskel på en linje i
> fil1 og en linje i fil2?
>
> Er vi enige om at vi ikke kan se forskel i 'cat fil1 fil2' og at
> uniq(1) ikke kan se forskel i 'cat fil1 fil2 | uniq'?
>
Jo, lad os da også være enige om at jeg ikke har læst opgaven
ordentligt
--
/Sv-E
Fjern sneglen ved direkte svar

Kim Hansen (27-03-2004)
Kommentar
Fra : Kim Hansen


Dato : 27-03-04 19:47

Sv-E Madsen <sv-erik@snailstofanet.dk> writes:

> Hej
> Hvis du vil bruge ren bash kan du gøre dette:
> <SNIP>
> cat fil1 fil2|uniq>fil1
> </SNIP>
> Hvis du ønsker at beholde din originale fil1, kan du jo bare pipe ud til et
> andet filnavn.

Ud over at det slet ikke loeser den stillede opgave saa starter bash
med at slette indholdet i fil1 inden cat faar aabnet filen. Dvs. at
kommandoen er aekvivalent med 'cat fil2 | uniq > fil1'.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-´` -. ;:-. | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Tlf: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Sv-E Madsen (27-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 27-03-04 21:13

Kim Hansen wrote:

> Sv-E Madsen <sv-erik@snailstofanet.dk> writes:
>
>> Hej
>> Hvis du vil bruge ren bash kan du gøre dette:
>> <SNIP>
>> cat fil1 fil2|uniq>fil1
>> </SNIP>
>> Hvis du ønsker at beholde din originale fil1, kan du jo bare pipe ud til
>> et andet filnavn.
>
> Ud over at det slet ikke loeser den stillede opgave saa starter bash
> med at slette indholdet i fil1 inden cat faar aabnet filen. Dvs. at
> kommandoen er aekvivalent med 'cat fil2 | uniq > fil1'.
>
Som det kan ses andetsteds i tråden, har jeg jo indrømmet fejlen. Men du
bliver lige nød til at forklare hvorfor du ikke mener at cat kan åbne mere
end en fil af gangen, det er dog det den er skrevet til.
--
/Sv-E
Fjern sneglen ved direkte svar

Kent Friis (27-03-2004)
Kommentar
Fra : Kent Friis


Dato : 27-03-04 22:04

Den Sat, 27 Mar 2004 21:13:15 +0100 skrev Sv-E Madsen:
>Kim Hansen wrote:
>
>> Sv-E Madsen <sv-erik@snailstofanet.dk> writes:
>>
>>> Hej
>>> Hvis du vil bruge ren bash kan du gøre dette:
>>> <SNIP>
>>> cat fil1 fil2|uniq>fil1
>>> </SNIP>
>>> Hvis du ønsker at beholde din originale fil1, kan du jo bare pipe ud til
>>> et andet filnavn.
>>
>> Ud over at det slet ikke loeser den stillede opgave saa starter bash
>> med at slette indholdet i fil1 inden cat faar aabnet filen. Dvs. at
>> kommandoen er aekvivalent med 'cat fil2 | uniq > fil1'.
>>
>Som det kan ses andetsteds i tråden, har jeg jo indrømmet fejlen. Men du
>bliver lige nød til at forklare hvorfor du ikke mener at cat kan åbne mere
>end en fil af gangen, det er dog det den er skrevet til.

Det var ikke det han skrev.

Først åbner bash fil1 for skrivning, og truncater den.
Dernæst åbner cat fil1, læser 0 bytes og lukker den igen.
Den går så igang med fil2, og nu begynder der så at komme et
output, hvorved fil1 vokser.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Sv-E Madsen (28-03-2004)
Kommentar
Fra : Sv-E Madsen


Dato : 28-03-04 08:16

Kent Friis wrote:
> Det var ikke det han skrev.
>
> Først åbner bash fil1 for skrivning, og truncater den.
> Dernæst åbner cat fil1, læser 0 bytes og lukker den igen.
> Den går så igang med fil2, og nu begynder der så at komme et
> output, hvorved fil1 vokser.
>
> Mvh
> Kent
Ja men det går jo ufatteligt godt for mig for tiden
--
/Sv-E
Fjern sneglen ved direkte svar

Kim Hansen (27-03-2004)
Kommentar
Fra : Kim Hansen


Dato : 27-03-04 22:41

Sv-E Madsen <sv-erik@snailstofanet.dk> writes:

> Kim Hansen wrote:
>
> > Sv-E Madsen <sv-erik@snailstofanet.dk> writes:
> >
> >> Hej
> >> Hvis du vil bruge ren bash kan du gøre dette:
> >> <SNIP>
> >> cat fil1 fil2|uniq>fil1
> >> </SNIP>
> >> Hvis du ønsker at beholde din originale fil1, kan du jo bare pipe ud til
> >> et andet filnavn.
> >
> > Ud over at det slet ikke loeser den stillede opgave saa starter bash
> > med at slette indholdet i fil1 inden cat faar aabnet filen. Dvs. at
> > kommandoen er aekvivalent med 'cat fil2 | uniq > fil1'.
> >
> Som det kan ses andetsteds i tråden, har jeg jo indrømmet fejlen. Men du

Ja, det var defor jeg skrev 'ud over', det er et helt andet problem i
loesningen jeg vil paapege.

> bliver lige nød til at forklare hvorfor du ikke mener at cat kan åbne mere
> end en fil af gangen, det er dog det den er skrevet til.

Kent har beskrevet hvad der er galt.

Det er et klassisk problem at man gerne vil lave noget i en pipeline
som retter i en fil, og saa proever man noget i stil med:
kommando1 fil | kommando2 | ... | kommandoN > fil
Resultatet er at man mister indholdet af sin fil. Jeg har proevet det
massere at gange, saa jeg ville lige spare andre den kedelig oplevelse.

Jeg tror det man savner er et program der tager et filnavn som
argument og derefter skriver stdin ned i en temporaer fil som omdoebes
til dette filnavn naar stdin lukkes. Findes dette allerede? Og ville
det loese problemet eller er der en detalje jeg har overset?

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-´` -. ;:-. | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Tlf: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Kent Friis (27-03-2004)
Kommentar
Fra : Kent Friis


Dato : 27-03-04 23:00

Den 27 Mar 2004 22:40:36 +0100 skrev Kim Hansen:
>
>Jeg tror det man savner er et program der tager et filnavn som
>argument og derefter skriver stdin ned i en temporaer fil som omdoebes
>til dette filnavn naar stdin lukkes. Findes dette allerede? Og ville
>det loese problemet eller er der en detalje jeg har overset?

Ja, filen vil skifte inode, og dermed vil det knække eventuelle
hardlinks til filen.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Thomas S. Iversen (27-03-2004)
Kommentar
Fra : Thomas S. Iversen


Dato : 27-03-04 14:58

On 2004-03-26, Thomas Lindgaard <thomas@it-snedkeren.BLACK_HOLE.dk> wrote:
> Hejsa
>
> Er der ikke en eller flere der kan hjælpe mig med at gøre følgende i en
> shell (bash):
>
> Slet alle linier i fil1 som også forekommer i fil2
>
> Jeg har ikke så mange ideer til hvordan det kan gøres...

man grep (du kan matche matche alle linier i en fil1 som findes i fil2. Du
vil gøre det modsatte, men dertil har grep en invert option. man grep

Thomas

Søg
Reklame
Statistik
Spørgsmål : 177502
Tips : 31968
Nyheder : 719565
Indlæg : 6408534
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste