Unix ja shell-ohjelmointi (TIE 205) Unix ja shell-ohjelmointi (TIE 205)

Demo 5, 27.10.1999, ratkaisut
Tehtävä 1

# Demo5
# Tehtävä 1
#
# teht1.awk
#
# Käyttö esim.: awk -F":" -f teht1.awk tied_nimi
#

{
  if (NF>0) printf $NF
  for (i=NF-1; i>0; i--) {
    printf FS$i
  }
  printf ORS
}

tai esim. muuttujaa katenoimalla

# Demo5
# Tehtävä 1
#
# teht1.awk
#
# Käyttö esim.: awk -F":" -f teht1.awk tied_nimi
#

{
  if (NF>0) tmp=$NF
  for (i=NF-1; i>0; i--) {
    tmp=tmp""FS""$i
  }
  printf tmp""ORS
}

Tehtävä 2

# Demo5
# Tehtävä 2
#
# teht2.awk
#
# Käyttö: awk -f teht2.awk

BEGIN{
  FS=":"
  printf "tunnus> " 
  getline uid < "-" 
  while (getline < "/etc/group") 
    # ensin vain "grepataan" annettua tunnusta, ei vielä anna varmaa tulosta
    if (index($4,uid)) {
      # jaetaan kaikki ryhmän uidit taulukoksi group
      split($4,group,",")
      # katsotaan onko uid taulukossa, "KALLISTA"
      for (i in group) {
        if (group[i] == uid) { print $1; break }
      }
    }
  close("/etc/group")
}

Tehtävä 3

#!/bin/sh
#
# Demo5
# Tehtävä 3
#
# lotto
#
# Käyttö: lotto arvottavien_lkm pallojen_lkm 

awk -v NUM=$1 -v MAXNUM=$2 '
BEGIN {
  if (NUM > MAXNUM) exit
  if (NUM <= 0) NUM = 7
  if (MAXNUM <= 0) MAXNUM = 39
  srand() 
  for (j = 1; j <= NUM; j++) {
    do {
      val = 1 + int(rand() * MAXNUM)
    } while (val in rivi)
    rivi[val] = val
  }
  k=0
  # Huomaa, että "indeksi" on merkkijono ja rivi[j] on numero
  for (j in rivi) jarj[k++]=rivi[j]
  jarjesta(jarj,k)
  for (j=0; j<k; j++) printf("%s ", jarj[j])
  printf("\n")
}

function jarjesta(taulu, lkm) {
  do {
    for (i=0; i<lkm-1; i++) {
      if (taulu[i]>taulu[i+1]) {
        tmp=taulu[i]; taulu[i]=taulu[i+1]; taulu[i+1]=tmp
        muuttui=1; 
      }
    }
  } while (muuttui--)
}
'

Tehtävä 4

# Demo5
# Tehtävä 4
#
# teht4.awk
#
# Käyttö: awk -f teht4.awk /etc/passwd

BEGIN{
  FS=":"
}
{
  #tähän voisi jonkunmoisen testin laittaa ...
  nimet[substr($5,1,index($5," ")-1)]++
}
END{
  for (i in nimet) {
    printf "%-20s: %d\n",i,nimet[i]
  }
}

Tehtävä 5

# Demo5
# Tehtävä 5
#
# teht5.awk
#
# Käyttö esim.: awk -f teht5.awk tied_nimi

BEGIN{
  FS="[ ]"
}
{
  for (i=1;i<=NF;i++) {
    a=substr($i,1,1)    
    b=substr($i,2)
    $i=toupper(a)""b
  }
  print $0
}

tai "ilman kenttiä"

# Demo5
# Tehtävä 5
#
# teht5.awk
#
# Käyttö esim.: awk -f teht5.awk tied_nimi

{
  while ( i=match($0,/(^|[ ])[^A-ZÄÖÅ ]/) ) {
    if (i==1) i=0   # jotta mahd. rivin ensimmäinen merkki onnistuu
    a=substr($0,1,i)
    b=toupper(substr($0,i+1,1))
    c=substr($0,i+2)
    $0=a""b""c
  }
  print $0
}


File translated from TEX by TTH, version 1.98.
On 27 Oct 1999, 17:33.