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

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

Månedens bedste
Årets bedste
Sidste års bedste