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