|
| AWK og tabulator separering Fra : JoeDoe |
Dato : 30-09-09 00:08 |
|
Jeg har følgende tekst:
IP-adr, Server-navn, Beskrivelse, Type
10.0.0.1, My Server Name, This is a description, High
10.0.0.2, Srv1, Nothing, Low
Bemærk at komma-tegnet representere en tabulator i min tekstfil og
tegnet er der ikke.
Jeg benytter p.t. nedenstående AWK sætning til at give mig et output
der vil ligne dette:
AWK: awk '{d+=1;printf("vIp(%d) = \"%s | %s %s %s | ",d,$1,$2,$3);for
(i=4;i<=NF;i++) printf("%s ",$i);printf("| High\"\n")}' myfile
OUT: vIp(1) = "10.0.0.1 | My Server Name | This is a description |
High"
eller
AWK: awk '{d+=1;printf("vIp(%d) = \"%s | %s | ",d,$1);for(i=2;i<=NF;i+
+) printf("%s ",$i);printf("| Low\"\n")}' myfile
OUT: vIp(1) = "10.0.0.2 | Srv1 | Nothing | Low"
Dette output bruger jeg til at danne nogle VBScript variabler, som jeg
så smider i mit VBScript og eksekvere.
Anyway, dét som jeg faktisk gerne vil er, at have lidt mere automatik
i denne, for som det er nu, skal jeg lave om i AWK sætningen hver gang
server-navnet ændres fra ét ord til flere ord.
Er der en måde, at finde ud af at dele på tabulator niveau således at
jeg ikke skal ændre AWK'en hver gang?
| |
Leif Neland (30-09-2009)
| Kommentar Fra : Leif Neland |
Dato : 30-09-09 09:12 |
|
> Er der en måde, at finde ud af at dele på tabulator niveau således at
> jeg ikke skal ændre AWK'en hver gang?
BEGIN {FS="\t";}
RTFM f.ex. man awk
Eller på nettet: http://www.manpagez.com/man/1/awk/
Leif
| |
Lars Kongshøj (30-09-2009)
| Kommentar Fra : Lars Kongshøj |
Dato : 30-09-09 09:15 |
|
JoeDoe skrev:
> Jeg har følgende tekst:
>
> IP-adr, Server-navn, Beskrivelse, Type
> 10.0.0.1, My Server Name, This is a description, High
> 10.0.0.2, Srv1, Nothing, Low
>
> Bemærk at komma-tegnet representere en tabulator i min tekstfil og
> tegnet er der ikke.
>
> Jeg benytter p.t. nedenstående AWK sætning til at give mig et output
> der vil ligne dette:
>
> AWK: awk '{d+=1;printf("vIp(%d) = \"%s | %s %s %s | ",d,$1,$2,$3);for
> (i=4;i<=NF;i++) printf("%s ",$i);printf("| High\"\n")}' myfile
> OUT: vIp(1) = "10.0.0.1 | My Server Name | This is a description |
> High"
>
> eller
>
> AWK: awk '{d+=1;printf("vIp(%d) = \"%s | %s | ",d,$1);for(i=2;i<=NF;i+
> +) printf("%s ",$i);printf("| Low\"\n")}' myfile
> OUT: vIp(1) = "10.0.0.2 | Srv1 | Nothing | Low"
>
> Dette output bruger jeg til at danne nogle VBScript variabler, som jeg
> så smider i mit VBScript og eksekvere.
>
> Anyway, dét som jeg faktisk gerne vil er, at have lidt mere automatik
> i denne, for som det er nu, skal jeg lave om i AWK sætningen hver gang
> server-navnet ændres fra ét ord til flere ord.
>
> Er der en måde, at finde ud af at dele på tabulator niveau således at
> jeg ikke skal ændre AWK'en hver gang?
Det oneliner er ulæselig. God stil er at skrive den slags i et script.
Dit egentlige problem er så vidt jeg lige kan se at du bruger mellemrum
som feltadskiller i awk, mens dit input bruger komma. Se man awk.
/Lars
| |
JoeDoe (30-09-2009)
| Kommentar Fra : JoeDoe |
Dato : 30-09-09 06:12 |
|
> > Er der en måde, at finde ud af at dele på tabulator niveau således at
> > jeg ikke skal ændre AWK'en hver gang?
>
> BEGIN {FS="\t";}
> RTFM f.ex. man awk
Jeg beklager men ja, det var jo faktisk nemmere end jeg lige regnede
med
Tak.
| |
JoeDoe (30-09-2009)
| Kommentar Fra : JoeDoe |
Dato : 30-09-09 06:17 |
|
> > IP-adr, Server-navn, Beskrivelse, Type
> > 10.0.0.1, My Server Name, This is a description, High
> > 10.0.0.2, Srv1, Nothing, Low
>
> > Bemærk at komma-tegnet representere en tabulator i min tekstfil og
> > tegnet er der ikke.
>
> > Jeg benytter p.t. nedenstående AWK sætning til at give mig et output
> > der vil ligne dette:
>
> > AWK: awk '{d+=1;printf("vIp(%d) = \"%s | %s %s %s | ",d,$1,$2,$3);for
> > (i=4;i<=NF;i++) printf("%s ",$i);printf("| High\"\n")}' myfile
> > OUT: vIp(1) = "10.0.0.1 | My Server Name | This is a description |
> > High"
>
> > eller
>
> > AWK: awk '{d+=1;printf("vIp(%d) = \"%s | %s | ",d,$1);for(i=2;i<=NF;i+
> > +) printf("%s ",$i);printf("| Low\"\n")}' myfile
> > OUT: vIp(1) = "10.0.0.2 | Srv1 | Nothing | Low"
Nu er min one-liner blevet langt mere overskuelig
awk '{ d+=1; FS="\t"; print("vIp("d") = \"" $1 " | " $2 " | " $3 " |
High\"")}' test
> > Er der en måde, at finde ud af at dele på tabulator niveau således at
> > jeg ikke skal ændre AWK'en hver gang?
>
> Det oneliner er ulæselig. God stil er at skrive den slags i et script.
Det er jeg slet ikke enig i - ok, just letlæselig er den måske ikke,
men den er da alt andet end ulæselig. Jeg kan godt lide one-liners, da
de nemt kan copy/pastes frem og tilbage mellem systemer, så at smide
det i scripts er kun en nødløsning for mig (når det bliver alt for
besværligt).
> Dit egentlige problem er så vidt jeg lige kan se at du bruger mellemrum
> som feltadskiller i awk, mens dit input bruger komma. Se man awk.
Som jeg skrev, så skulle du se bort fra kommaet, som repræsentere en
tabulator.
| |
Klaus Alexander Seis~ (30-09-2009)
| Kommentar Fra : Klaus Alexander Seis~ |
Dato : 30-09-09 14:07 |
|
JoeDoe skrev:
> Nu er min one-liner blevet langt mere overskuelig
>
> awk '{ d+=1; FS="\t"; print("vIp("d") = \"" $1 " | " $2 " | " $3 " | High\"")}' test
Der er vel ingen grund til at sætte FS for hver eneste linje.
Brug i stedet fx den syntax der blev foreslået andetsteds:
awk 'BEGIN { FS="\t" } {d += 1; print( […] ) }' test
Mvh,
--
Klaus Alexander Seistrup
http://klaus.seistrup.dk/
| |
JoeDoe (30-09-2009)
| Kommentar Fra : JoeDoe |
Dato : 30-09-09 07:18 |
|
> > Nu er min one-liner blevet langt mere overskuelig
>
> > awk '{ d+=1; FS="\t"; print("vIp("d") = \"" $1 " | " $2 " | " $3 " | High\"")}' test
>
> Der er vel ingen grund til at sætte FS for hver eneste linje.
> Brug i stedet fx den syntax der blev foreslået andetsteds:
>
> awk 'BEGIN { FS="\t" } {d += 1; print( […] ) }' test
Ahhh ok. Takker mange gange - dette løste faktisk en fejl som jeg
netop sad med - den første linie blev splittet op mærkeligt selv om
der ikke var tabulator lige dér. Efter dit fix løste det sig, så det
var helt perfekt timing
| |
Peter Dalgaard (30-09-2009)
| Kommentar Fra : Peter Dalgaard |
Dato : 30-09-09 18:18 |
|
On Wed, 30 Sep 2009 06:18:13 -0700, JoeDoe wrote:
>> > Nu er min one-liner blevet langt mere overskuelig
>>
>> > awk '{ d+=1; FS="\t"; print("vIp("d") = \"" $1 " | " $2 " | " $3 " |
>> > High\"")}' test
>>
>> Der er vel ingen grund til at sætte FS for hver eneste linje. Brug i
>> stedet fx den syntax der blev foreslået andetsteds:
>>
>>  awk 'BEGIN { FS="\t" } {d += 1; print( […] ) }' test
>
> Ahhh ok. Takker mange gange - dette løste faktisk en fejl som jeg netop
> sad med - den første linie blev splittet op mærkeligt selv om der ikke
> var tabulator lige dér. Efter dit fix løste det sig, så det var helt
> perfekt timing
Bemærk også
awk -F\\t '{print "vip(" ++d ") = \"" $1 " | " $2 " | " $3 " | High\"")}'
test
eller måske (lidt længere, men lettere at læse om et år)
awk -F\\t '{printf("vip(%d) = \"%s | %s | %s | High\"\n", ++d, $1, $2,
$3)}' test
--
O__ ---- Peter Dalgaard Øster Farimagsgade 5, Entr.B
c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk) FAX: (+45) 35327907
| |
|
|