Inbyggda variabler
Det finns gott om inbyggda variabler i awk. Vi tar en titt på några av dem.
#Field separator
Filen som används är example/phones.txt. Det är en liten fil med följande innehåll:
Brand,Model,Price,Units Apple,iPhone X,8000,3 Apple,iPhone 11,10000,14 Samsung,Galaxy S20,9500,8 Samsung,Galaxy S21+,11500,13 Samsung,Galaxy Note20,8000,4
Tänk filen som ett litet lager. Det finns tex 8st Samsung Galaxy S20 och de kostar 9500kr styck.
Om vi börjar med att dumpa ut hela filen med awk kan kommandot se ut såhär:
$ awk '{print $0}' phones.txt Brand,Model,Price,Units Apple,iPhone X,8000,3 Apple,iPhone 11,10000,14 Samsung,Galaxy S20,9500,8 Samsung,Galaxy S21+,11500,13 Samsung,Galaxy Note20,8000,4
$0 innehåller hela raden separerad med RS (\n
). Vi kommer då skriva ut alla rader i filen. Oftast vill man inte ändra på RS.
Notera att vi inte behöver BEGIN här, då vi inte exekverar något innan filen läses in.
Alla delarna som blir uppdelade med FS (mellanslag) kommer hamna i $1
, $2
etc.
Testar att enbart skriva ut det första fältet:
$ awk '{print $1}' phones.txt Brand,Model,Price,Units Apple,iPhone Apple,iPhone Samsung,Galaxy Samsung,Galaxy Samsung,Galaxy
Nu är de olika fälten separerade med ,
så då får vi byta FS:
$ awk '{FS=","; print $1}' phones.txt Brand,Model,Price,Units Apple Apple Samsung Samsung Samsung
Notera att första raden inte har separerats med ,
. Anledningen är att raden läses in innan FS=”,” börjar gälla. Här måste vi använda BEGIN:
$ awk 'BEGIN {FS=","} {print $1}' phones.txt Brand Apple Apple Samsung Samsung Samsung
#Output Field Separator (OFS)
Vi kan med hjälp av OFS göra om utskrifterna. Om vi inte styr om den själva är OFS ett mellanslag.
Vi kör vidare med vår fil. Låt säga att vi vill skriva ut i formatet: modell=tillverkare. Först tittar vi på hur det blir om vi inte ändrar den:
$ awk 'BEGIN {FS=","} {print $2,$1}' phones.txt Model Brand iPhone X Apple iPhone 11 Apple Galaxy S20 Samsung Galaxy S21+ Samsung Galaxy Note20 Samsung
Bra. Det blir ju som planerat. Nu byter vi OFS:
$ awk 'BEGIN {FS=","; NR>1; OFS="="} {print $2,$1}' phones.txt Model=Brand iPhone X=Apple iPhone 11=Apple Galaxy S20=Samsung Galaxy S21+=Samsung Galaxy Note20=Samsung
OFS stöder även \t
, \n
m.m. Det går även att ha en lång rad tex:
OFS="\n\tlite text"
.
#Övriga inbyggda variabler
Det finns fler inbyggda variabler att ha lite koll på.
- NR - Number of Records. Den ökar automatiskt till den nuvarande radens nummer.
- NF - Number of Fields (in a record)
- FILENAME - namnet på filen som läses in
- FNR - Number of Records i relation till inputfilen. Vi kan läsa in fler filer samtidigt och FNR ger då radnumret för den aktuella filen och inte totalen.
Vi kan använda NR
på följande sätt för att ta bort den första raden i utskriften:
$ awk 'BEGIN {FS=","; OFS="="} NR>1 {print $2,$1}' phones.txt iPhone X=Apple iPhone 11=Apple Galaxy S20=Samsung Galaxy S21+=Samsung Galaxy Note20=Samsung
Stiligt! Med NR>1
talar vi om att vi vill jobba med raderna vars nummer är större än 1. Vi skriver ut två fält av alla rader, utom första.
Nu går vi över till att ha scriptet i en fil.
#Revision history
- 2020-02-10: (A, lew) Första versionen.