AWK脚本报错‘function `header` not defined’技术求助
AWK脚本报错:
FNR=1 fatal: function header not defined 我接手了一套代码,这套代码通过AWK读取CSV文件并生成格式化列表,但运行时出现错误:FNR=1 fatal: function header not defined。这套代码此前可正常运行,不清楚故障持续时长,现寻求技术帮助。相关文件如下:
CSV文件
"POSN","STATUS","TITLE","BEGIN_DATE","END_DATE","ROLL","PIDM","A_NUMBER","FIRST_NAME","LAST_NAME","EGRP" "C99999","A","Title","01-JUL-95","","C",888888,"A00888888","John","Doe1","22" "C99999","A","Ttile","01-JUL-95","","C",9999999,"A09999999","John","Doe2","23" "C11111","A","Title","01-JUL-95","","C",0000001,"A00000001","John","Doe3","01"
$PROG_LC.awk
# fieldname len # 1 posn 6 # 2 status 1 # 3 title 30 # 4 begin_date 10 # 5 end_date 10 # 6 roll 1 # 7 a_number 8 # 8 a_number 9 # 9 first_name 15 # 10 last_name 30 # 11 egrp 4 BEGIN { pagelen = 20; pagewidth = 126 lenheader = 4; lendetail = 1; lenfooter = 2 } header() { print trititle("XXXXXXX", "Report", sprintf("Page %d", pagenum)) print "" print " Posn S Title Begin Date End Date " \ "R A-Number First Name Last Name Egrp" print "------ - ------------------------------ ---------- ---------- " \ "- -------- --------- --------------- ------------------------------ ----" } detail(X) { printf "%-6.6s %-1.1s %-30.30s %-10.10s %-10.10s %-1.1s %-8.8s %-9.9s " \ "%-15.15s %-30.30s %-4.4s\n", X[1], X[2], X[3], X[4], X[5], X[6], X[7], X[8], X[9], X[10], X[11] } footer() { print ""; print trititle(user "@" sid, one_up, today) }
Shell脚本
#!/bin/sh . $BANNER_HOME/local/exe/local_init.sh H=/home/jobsub/${ORACLE_SID}_LOGS PROG_LC=`echo $PROG | tr "[A-Z]" "[a-z]"` PROG_UC=`echo $PROG | tr "[a-z]" "[A-Z]"` CSV=$H/$(basename $PROG_LC .shl)_${ONE_UP}.csv LOG=$H/$(basename $PROG_LC .shl)_${ONE_UP}.log WHOAMI=$(whoami) echo "BANUID = $BANUID" >> $LOG echo "ONE_UP = $ONE_UP" >> $LOG echo "PROG = $PROG" >> $LOG echo "PRNT = $PRNT" >> $LOG echo "ORACLE_SID = $ORACLE_SID" >> $LOG echo "H = $H" >> $LOG echo "PROG_LC = $PROG_LC" >> $LOG echo "PROG_UC = $PROG_UC" >> $LOG echo "CSV = $CSV" >> $LOG echo "LOG = $LOG" >> $LOG echo "WHOAMI = $WHOAMI" >> $LOG echo "LOCAL_EXE = $LOCAL_EXE" >> $LOG sqlplus -s $BAN9UID/@${TARGETDB} <<EOF variable status number begin :status := storedprocs.write_csv_file('$PROG_LC', $ONE_UP); end; / exit :status EOF STATUS="$?" echo "RETURN CODE = $STATUS" >> $LOG if [ $STATUS -eq 0 ] then echo "$PROG_UC completed successfully" >> $LOG else echo "$PROG_UC completed with failure" >> $LOG fi if [ -f $LOCAL_EXE/$PROG_LC.awk ] then LIS=$H/$(basename $PROG_LC .shl)_${ONE_UP}.lis LC_NUMERIC=en_US.utf8 gawk -f $LOCAL_EXE/csvtolis.awk \ -f $LOCAL_EXE/$PROG_LC.awk $CSV > $LIS gurinso -n $ONE_UP -l $LIS -j $PROG -w $BANUID $BAN9UID/@${TARGETDB} fi exit $STATUS
csvtolis.awk
BEGIN { linenum = 0 pagenum = 0 user = toupper(ENVIRON["BAN9UID"]) sid = ENVIRON["ORACLE_SID"] oneup = ENVIRON["ONE_UP"] "date +%m/%d/%Y" | getline today } function csvsplit(str, arr, i,j,n,s,fs,qt) { # split comma-separated fields into arr; return number of fields in arr # fields surrounded by double-quotes may contain commas; # doubled double-quotes represent a single embedded quote delete arr; s = "START"; n = 0; fs = ","; qt = "\"" for (i = 1; i <= length(str); i++) { if (s == "START") { if (substr(str,i,1) == fs) { arr[++n] = "" } else if (substr(str,i,1) == qt) { j = i+1; s = "INQUOTES" } else { j = i; s = "INFIELD" } } else if (s == "INFIELD") { if (substr(str,i,1) == fs) { arr[++n] = substr(str,j,i-j); j = 0; s = "START" } } else if (s == "INQUOTES") { if (substr(str,i,1) == qt) { s = "MAYBEDOUBLE" } } else if (s == "MAYBEDOUBLE") { if (substr(str,i,1) == fs) { arr[++n] = substr(str,j,i-j-1) gsub(qt qt, qt, arr[n]); j = 0; s = "START" } } } if (s == "INFIELD" || s == "INQUOTES") { arr[++n] = substr(str,j) } else if (s == "MAYBEDOUBLE") { arr[++n] = substr(str,j,length(str)-j); gsub(qt qt, qt, arr[n]) } else if (s == "START") { arr[++n] = "" } return n } function trititle(left, center, right, gap1, gap2) { # assume sufficient space gap1 = int((pagewidth - length(center)) / 2) - length(left) gap2 = pagewidth - length(left) - length(center) - length(right) - gap1 return left sprintf("%*s", gap1, "") center sprintf("%*s", gap2, "") right } NR > 1 { nfields = csvsplit($0, csv); # print one record, with header/footer as needed if (pagelen - (linenum % pagelen) - lenfooter < lendetail) { while ((linenum + lenfooter) % pagelen != 0) { print ""; linenum++ } footer(); linenum += lenfooter } if (linenum % pagelen == 0) { pagenum++; header(); linenum += lenheader } detail(csv); linenum += lendetail if ((linenum + lenfooter) % pagelen == 0) { footer(); linenum += lenfooter } } END { if (linenum % pagelen != 0) { # if not at top of page while ((linenum + lenfooter) % pagelen != 0) { # while not at bottom print ""; linenum++ } # skip to bottom footer() } } # and print footer
内容的提问来源于stack exchange,提问作者user3685388
相关产品推荐
相关产品推荐

