/ 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
Kan ikke få join til at fungere
Fra : JoeDoe


Dato : 20-10-09 23:48

Jeg har følgende to filer:

ip_done.txt:
10.175.227.100
10.175.227.101
10.175.227.105
10.175.227.106

ip_site.txt:
10.175.227.89 Site 2 Server 1
10.175.227.90 Site 2 Server 2
10.175.227.100 Site 2 Server 3
10.175.227.101 Site 2 Server 4
10.175.227.105 Site 2 Server 5
10.175.227.106 Site 2 Server 6

Dét som jeg har brug for er, at få listet de linier som matcher med IP
adresserne i "ip_done.txt". Bemærk at adskillelsen i "ip_site.txt" er
med tabulator. Jeg synes det burde fungere helt simpelt med denne
kommando:

join -t '\t' ip_done.txt ip_site.txt

... men det giver intet output. Bemærk at \t skal erstattes af CTRL+v
+tabulator.

Hvad gør jeg galt?

 
 
Mogens Kjaer (21-10-2009)
Kommentar
Fra : Mogens Kjaer


Dato : 21-10-09 07:05

On 10/21/2009 07:48 AM, JoeDoe wrote:
> join -t '\t' ip_done.txt ip_site.txt
>
> .. men det giver intet output. Bemærk at \t skal erstattes af CTRL+v
> +tabulator.
>
> Hvad gør jeg galt?

Hm, min join skriver:

join: file 2 is not in sorted order

$ sort < ip_done.txt > ip_done.srt
$ sort < ip_site.txt > ip_site.srt
$ join -t ' ' ip_done.srt ip_site.srt
10.175.227.100 Site 2 Server 3
10.175.227.101 Site 2 Server 4
10.175.227.105 Site 2 Server 5
10.175.227.106 Site 2 Server 6

Mogens
--
Mogens Kjaer, Carlsberg A/S, Computer Department
Gamle Carlsberg Vej 10, DK-2500 Valby, Denmark
Phone: +45 33 27 53 25, Mobile: +45 22 12 53 25
Email: mk@crc.dk Homepage: http://www.crc.dk

JoeDoe (21-10-2009)
Kommentar
Fra : JoeDoe


Dato : 21-10-09 00:16

> > Hvad gør jeg galt?
>
> Hm, min join skriver:
> join: file 2 is not in sorted order

Den er da sorteret på IP adresse men det er måske ikke det samme som
hvad "sort" gør. OK, den er taget til efterretning.

> $ sort < ip_done.txt > ip_done.srt
> $ sort < ip_site.txt > ip_site.srt
> $ join -t '       ' ip_done.srt ip_site.srt
> 10.175.227.100  Site 2  Server 3
> 10.175.227.101  Site 2  Server 4
> 10.175.227.105  Site 2  Server 5
> 10.175.227.106  Site 2  Server 6

Hvis jeg gør det på præcis samme måde får jeg kun én linie:

sort < ip_done.txt > ip_done.srt
sort < ip_site.txt > ip_site.srt
join -t ' ' ip_done.srt ip_site.srt
10.175.227.106 Site 2 Server 6

N/A (21-10-2009)
Kommentar
Fra : N/A


Dato : 21-10-09 09:25



Peter Makholm (21-10-2009)
Kommentar
Fra : Peter Makholm


Dato : 21-10-09 08:56

JoeDoe <joedoe10@gmail.com> writes:

>> Hm, min join skriver:
>> join: file 2 is not in sorted order
>
> Den er da sorteret på IP adresse men det er måske ikke det samme som
> hvad "sort" gør. OK, den er taget til efterretning.

join vil ganske givet have filerne sorteret i ren lexiografisk
sortering og ikke hvor dele af linjerne bliver fortolket som tal.

//Makholm

JoeDoe (21-10-2009)
Kommentar
Fra : JoeDoe


Dato : 21-10-09 02:08

> >> Hm, min join skriver:
> >> join: file 2 is not in sorted order
>
> > Den er da sorteret på IP adresse men det er måske ikke det samme som
> > hvad "sort" gør. OK, den er taget til efterretning.
>
> join vil ganske givet have filerne sorteret i ren lexiografisk
> sortering og ikke hvor dele af linjerne bliver fortolket som tal.

Er der ikke en måde at sortere on-the-fly, så man undgår temp.filer?
Man kan ikke tage en "join `sort file1` `sort file2`" eller lignende?

Mogens Kjaer (21-10-2009)
Kommentar
Fra : Mogens Kjaer


Dato : 21-10-09 09:25

On 10/21/2009 10:08 AM, JoeDoe wrote:
....
> Er der ikke en måde at sortere on-the-fly, så man undgår temp.filer?
> Man kan ikke tage en "join `sort file1` `sort file2`" eller lignende?

Svært, når join jo skal læse to steder fra.

Måske noget med named pipes:

mkfifo /tmp/file1_$$
mkfifo /tmp/file2_$$
sort <ip_done.txt >/tmp/file1_$$ &
sort <ip_site.txt >/tmp/file2_$$ &
join -t ' ' /tmp/file1_$$ /tmp/file2_$$
rm -f /tmp/file1_$$ /tmp/file2_$$

Men så kan man ligesågodt bruge temp. filer.

Hvis input filerne er meget store bruger sort
sikkert også temp. filer.

Mogens
--
Mogens Kjaer, Carlsberg A/S, Computer Department
Gamle Carlsberg Vej 10, DK-2500 Valby, Denmark
Phone: +45 33 27 53 25, Mobile: +45 22 12 53 25
Email: mk@crc.dk Homepage: http://www.crc.dk

Niels Baggesen (21-10-2009)
Kommentar
Fra : Niels Baggesen


Dato : 21-10-09 10:22

Mogens Kjaer <mk@crc.dk> wrote:
> On 10/21/2009 10:08 AM, JoeDoe wrote:
> ...
> > Er der ikke en måde at sortere on-the-fly, så man undgår temp.filer?
> > Man kan ikke tage en "join `sort file1` `sort file2`" eller lignende?

> Svært, når join jo skal læse to steder fra.

> Måske noget med named pipes:

bash kan klare det for dig:

join <(sort ip_done.txt) <(sort ip_site.txt)

/Niels

--
Niels Baggesen -- @home -- Århus -- Denmark -- niels@baggesen.net
The purpose of computing is insight, not numbers -- R W Hamming

Ukendt (21-10-2009)
Kommentar
Fra : Ukendt


Dato : 21-10-09 10:34

JoeDoe wrote:
>>>> Hm, min join skriver:
>>>> join: file 2 is not in sorted order
>>> Den er da sorteret på IP adresse men det er måske ikke det samme som
>>> hvad "sort" gør. OK, den er taget til efterretning.
>> join vil ganske givet have filerne sorteret i ren lexiografisk
>> sortering og ikke hvor dele af linjerne bliver fortolket som tal.
>
> Er der ikke en måde at sortere on-the-fly, så man undgår temp.filer?

sort -o fil fil

Mvh
Martin

N/A (21-10-2009)
Kommentar
Fra : N/A


Dato : 21-10-09 09:25



Jacob Bunk Nielsen (21-10-2009)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 21-10-09 12:40

JoeDoe <joedoe10@gmail.com> writes:

> Jeg har følgende to filer:
>
> ip_done.txt:
> 10.175.227.100
> [ ... ]
>
> ip_site.txt:
> 10.175.227.89 Site 2 Server 1
> [ ... ]
>
> Dét som jeg har brug for er, at få listet de linier som matcher med IP
> adresserne i "ip_done.txt". Bemærk at adskillelsen i "ip_site.txt" er
> med tabulator. Jeg synes det burde fungere helt simpelt med denne
> kommando:
>
> join -t '\t' ip_done.txt ip_site.txt

Jeg tror bare jeg ville bruge grep:

grep -f ip_done.txt ip_site.txt

Skal du have sorteret, så tilføj '|sort'.

--
Jacob - www.bunk.cc

Mogens Kjaer (21-10-2009)
Kommentar
Fra : Mogens Kjaer


Dato : 21-10-09 13:01

On 10/21/2009 01:40 PM, Jacob Bunk Nielsen wrote:
....
> Jeg tror bare jeg ville bruge grep:
>
> grep -f ip_done.txt ip_site.txt

Har du

10.175.227.10

i ip_done.txt vil den vel også matche

10.175.227.100

i ip_site.txt?

Mogens

--
Mogens Kjaer, Carlsberg A/S, Computer Department
Gamle Carlsberg Vej 10, DK-2500 Valby, Denmark
Phone: +45 33 27 53 25, Mobile: +45 22 12 53 25
Email: mk@crc.dk Homepage: http://www.crc.dk

Klaus Ellegaard (21-10-2009)
Kommentar
Fra : Klaus Ellegaard


Dato : 21-10-09 13:04

Mogens Kjaer <mk@crc.dk> writes:

>Har du
>10.175.227.10
>i ip_done.txt vil den vel også matche

Ja, og

1.2.3.4

vil matche

171.223.49.68

Mvh.
   Klaus.

Mogens Kjaer (21-10-2009)
Kommentar
Fra : Mogens Kjaer


Dato : 21-10-09 13:22

On 10/21/2009 02:04 PM, Klaus Ellegaard wrote:
....
> 1.2.3.4
>
> vil matche
>
> 171.223.49.68

Måske:

grep -w -f ip_done.txt ip_site.txt

er bedre?

Mogens

--
Mogens Kjaer, Carlsberg A/S, Computer Department
Gamle Carlsberg Vej 10, DK-2500 Valby, Denmark
Phone: +45 33 27 53 25, Mobile: +45 22 12 53 25
Email: mk@crc.dk Homepage: http://www.crc.dk

Klaus Ellegaard (21-10-2009)
Kommentar
Fra : Klaus Ellegaard


Dato : 21-10-09 13:36

Mogens Kjaer <mk@crc.dk> writes:

>grep -w -f ip_done.txt ip_site.txt
>er bedre?

Ja, eller lige fikse "ip_done.txt" med lidt livrem og seler:

sed -e 's/^/^/' -e 's/$/$/' -e 's/\./\\./g' ip_done.txt > hest &&
mv hest ip_done.txt

Mvh.
   Klaus.

JoeDoe (21-10-2009)
Kommentar
Fra : JoeDoe


Dato : 21-10-09 05:56

> > > Er der ikke en måde at sortere on-the-fly, så man undgår temp.filer?
> > > Man kan ikke tage en "join `sort file1` `sort file2`" eller lignende?
>
> bash kan klare det for dig:
> join <(sort ip_done.txt) <(sort ip_site.txt)

Perfekt, men jeg forstår ikke hvorfor der ikke må være mellemrum
mellem <( ? Jeg ville jo foretrække denne linie:
join < (sort ip_done.txt) < (sort ip_site.txt)
...og helst endda uden () men det er OK

Men det giver denne fejl (sikkert forståeligt nok hvis man forstår
det):
-bash: syntax error near unexpected token `('

Kent Friis (21-10-2009)
Kommentar
Fra : Kent Friis


Dato : 21-10-09 18:41

Den Wed, 21 Oct 2009 04:55:50 -0700 (PDT) skrev JoeDoe:
>> > > Er der ikke en måde at sortere on-the-fly, så man undgår temp.filer?
>> > > Man kan ikke tage en "join `sort file1` `sort file2`" eller lignende?
>>
>> bash kan klare det for dig:
>> join <(sort ip_done.txt) <(sort ip_site.txt)
>
> Perfekt, men jeg forstår ikke hvorfor der ikke må være mellemrum
> mellem <( ? Jeg ville jo foretrække denne linie:
> join < (sort ip_done.txt) < (sort ip_site.txt)
> ..og helst endda uden () men det er OK

Fordi < og <( er to forskellige "kommandoer".

< betyder læs fra en fil.
<( ... ) betyder læs fra et program.

Mvh
Kent
--
"The Brothers are History"

JoeDoe (21-10-2009)
Kommentar
Fra : JoeDoe


Dato : 21-10-09 06:01

> > Dét som jeg har brug for er, at få listet de linier som matcher med IP
> > adresserne i "ip_done.txt". Bemærk at adskillelsen i "ip_site.txt" er
> > med tabulator. Jeg synes det burde fungere helt simpelt med denne
> > kommando:
>
> > join -t '\t' ip_done.txt ip_site.txt
>
> Jeg tror bare jeg ville bruge grep:
> grep -f ip_done.txt ip_site.txt

Ahh, ja den er god og nem - og den behøver ikke en sorteret liste, så
den vil jeg bruge. Takker mange gange.

N/A (21-10-2009)
Kommentar
Fra : N/A


Dato : 21-10-09 15:56



Jacob Bunk Nielsen (21-10-2009)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 21-10-09 13:25

JoeDoe <joedoe10@gmail.com> writes:

>> > Dét som jeg har brug for er, at få listet de linier som matcher med IP
>> > adresserne i "ip_done.txt". Bemærk at adskillelsen i "ip_site.txt" er
>> > med tabulator. Jeg synes det burde fungere helt simpelt med denne
>> > kommando:
>>
>> > join -t '\t' ip_done.txt ip_site.txt
>>
>> Jeg tror bare jeg ville bruge grep:
>> grep -f ip_done.txt ip_site.txt
>
> Ahh, ja den er god og nem - og den behøver ikke en sorteret liste, så
> den vil jeg bruge. Takker mange gange.

Vær opmærksom på at '.' matcher hvad som helst, så Mogens og Klaus har
gode pointer omkring hvilke problemer der kan være.

Hvis dine lister er meget lange, så er den heller ikke ret effektiv.

--
Jacob - www.bunk.cc

JoeDoe (21-10-2009)
Kommentar
Fra : JoeDoe


Dato : 21-10-09 06:40

> >> Jeg tror bare jeg ville bruge grep:
> >> grep -f ip_done.txt ip_site.txt
>
> > Ahh, ja den er god og nem - og den behøver ikke en sorteret liste, så
> > den vil jeg bruge. Takker mange gange.
>
> Vær opmærksom på at '.' matcher hvad som helst, så Mogens og Klaus har
> gode pointer omkring hvilke problemer der kan være.

Ja, jeg kan godt se det nu her efterfølgende, at f.eks. også
"10.0.0.1" vil finde .1, .10, .11 osv osv og dét er jo ikke
hensigtsmæssigt. Jeg havde ellers lige håbet på sådan en nem
løsning

> Hvis dine lister er meget lange, så er den heller ikke ret effektiv.

Listerne er ikke så lange, at tiden er af betydning.

Frank Damgaard (21-10-2009)
Kommentar
Fra : Frank Damgaard


Dato : 21-10-09 15:56

JoeDoe wrote:
>>>> Jeg tror bare jeg ville bruge grep:
>>>> grep -f ip_done.txt ip_site.txt
>>> Ahh, ja den er god og nem - og den behøver ikke en sorteret liste, så
>>> den vil jeg bruge. Takker mange gange.
>> Vær opmærksom på at '.' matcher hvad som helst, så Mogens og Klaus har
>> gode pointer omkring hvilke problemer der kan være.
>
> Ja, jeg kan godt se det nu her efterfølgende, at f.eks. også
> "10.0.0.1" vil finde .1, .10, .11 osv osv og dét er jo ikke
> hensigtsmæssigt. Jeg havde ellers lige håbet på sådan en nem
> løsning


det med "." matcher hvad som helst kan nu klares med passende escape af
punktum så regular expression ikke matcher.
det betyder dog den ene fil lige skal laves list om i en linie for sig.

sed 's/\./\\./g' ip_done.txt > ip_done.rex

ved at sætte et \ foran . i filen så matche punktum og ikke "joker". :

$ cat ip_done.rex
10\.175\.227\.100
10\.175\.227\.101
10\.175\.227\.105
10\.175\.227\.106


... og hvis det ikke er nok, såkan man jo lave lidt i awk eller perl.


N/A (21-10-2009)
Kommentar
Fra : N/A


Dato : 21-10-09 15:56



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

Månedens bedste
Årets bedste
Sidste års bedste