42 lines
876 B
Awk
42 lines
876 B
Awk
# syntax: GAWK -f CUSIP.AWK
|
|
BEGIN {
|
|
n = split("037833100,17275R102,38259P508,594918104,68389X106,68389X105",arr,",")
|
|
for (i=1; i<=n; i++) {
|
|
printf("%9s %s\n",arr[i],cusip(arr[i]))
|
|
}
|
|
exit(0)
|
|
}
|
|
function cusip(n, c,i,sum,v,x) {
|
|
# returns: 1=OK, 0=NG, -1=bad data
|
|
if (length(n) != 9) {
|
|
return(-1)
|
|
}
|
|
for (i=1; i<=8; i++) {
|
|
c = substr(n,i,1)
|
|
if (c ~ /[0-9]/) {
|
|
v = c
|
|
}
|
|
else if (c ~ /[A-Z]/) {
|
|
v = index("ABCDEFGHIJKLMNOPQRSTUVWXYZ",c) + 9
|
|
}
|
|
else if (c == "*") {
|
|
v = 36
|
|
}
|
|
else if (c == "@") {
|
|
v = 37
|
|
}
|
|
else if (c == "#") {
|
|
v = 38
|
|
}
|
|
else {
|
|
return(-1)
|
|
}
|
|
if (i ~ /[02468]/) {
|
|
v *= 2
|
|
}
|
|
sum += int(v / 10) + (v % 10)
|
|
}
|
|
x = (10 - (sum % 10)) % 10
|
|
return(substr(n,9,1) == x ? 1 : 0)
|
|
}
|