Task

For each number list of 6-digit SEDOLs, calculate and append the checksum digit.



That is, given this input:

710889
B0YBKJ
406566
B0YBLH
228276
B0YBKL
557910
B0YBKR
585284
B0YBKT
B00030

Produce this output:

7108899
B0YBKJ7
4065663
B0YBLH2
2282765
B0YBKL9
5579107
B0YBKR5
5852842
B0YBKT7
B000300

Extra credit

Check each input is correctly formed, especially with respect to valid characters allowed in a SEDOL string.



Related tasks

   Luhn test
   ISIN


function ord(a)
{
  return amap[a]
}
 
function sedol_checksum(sed)
{
  sw[1] = 1; sw[2] = 3; sw[3] = 1
  sw[4] = 7; sw[5] = 3; sw[6] = 9
  sum = 0
  for(i=1; i <= 6; i++) {
    c = substr(toupper(sed), i, 1)
    if ( c ~ /[[:digit:]]/ ) {
      sum += c*sw[i]
    } else {
      sum += (ord(c)-ord("A")+10)*sw[i]
    }
  }
  return (10 - (sum % 10)) % 10
}
 
BEGIN { # prepare amap for ord
  for(_i=0;_i<256;_i++) {
    astr = sprintf("%c", _i)
    amap[astr] = _i
  }
}
 
/[AEIOUaeiou]/ {
  print "'" $0 "' not a valid SEDOL code"
  next
}
{
  if ( (length($0) > 7) || (length($0) < 6) ) {
    print "'" $0 "' is too long or too short to be valid SEDOL"
    next
  }
  sedol = substr($0, 1, 6)
  sedolcheck = sedol_checksum(sedol)
  if ( length($0) == 7 ) {
    if ( (sedol sedolcheck) != $0 ) {
      print sedol sedolcheck " (original " $0 " has wrong check digit"
    } else {
      print sedol sedolcheck
    }
  } else {
    print sedol sedolcheck
  }
}