|
| 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
| |
|
|