#! /usr/bin/gawk -f # Last edited on 2013-05-23 22:44:26 by stolfilocal BEGIN \ { USAGE = ( \ ARGV[0] " \\\n" \ " -v stag={SESSION_TAG} \\\n" \ " -v ne={NUMBER_OF_ELECTRODES} \\\n" \ " -v elA={ELECTRODE_A_INDEX} \\\n" \ " -v elB={ELECTRODE_B_INDEX} \\\n" \ " -v nv={NUMBER_OF_WINDOWS} \\\n" \ " {CORREL_FILE}.dat \\\n" \ " > {SINGLE_PAIR_CORREL}.txt" \ ); if (stag == "") { arg_error(("must define the session tag {stag}")); } if (ne == "") { arg_error(("must define the number of electrodes {ne}")); } ne = check_number(ne,"ne",1,10000); if (elA == "") { arg_error(("must define the first electrode index {elA}")); } elA = check_number(elA,"elA",1,ne); if (elB == "") { arg_error(("must define the second electrode index {elB}")); } elB = check_number(elB,"elB",1,ne); if (nv == "") { arg_error(("must define the number of time windows {nv}")); } nv = check_number(nv,"nv",1,10000); nr = -1; # For now. } /^[ ]*[0-9]+[ ]+[0-9]+[ ]/ \ { if (NF <= 2) { data_error(("bad format {NF} = " NF)); } iA = check_number($1,"iA",1,ne); iB = check_number($2,"iB",1,ne); if ((iA < 1) || (iA > 20)) { data_error(("invalid {iA} = " iA )); } if ((iB < 1) || (iB > 20)) { data_error(("invalid {iB} = " iB )); } if ((iA == elA) && (iB == elB)) { nr = 0; kf = 3; while(kf <= NF) { nr++; kr = nr; for (kv = 1; kv <= nv; kv++) { if (kf > NF) { data_error(("incomplete data {kr} = " kr " {kv} = " kv " {NF} = " NF)); } val[kr,kv] = $(kf); kf++; } } printf "extracted %d repetitions with %d samples each\n", nr, nv > "/dev/stderr"; # Output the data in array format printf "session = %s\n", stag; printf "electrodeA = %d\n", elA; printf "electrodeB = %d\n", elB; printf "windows = %d\n", nv; printf "repeats = %d\n", nr; for (kv = 1; kv <= nv; kv++) { printf "%4d", kv; for (kr = 1; kr <= nr; kr++) { printf " %+7.4f", val[kr,kv]; } printf "\n"; } } next; } // \ { data_error(("invalid format")); } END \ { if (nr < 0) { data_error(("eectrode pair (" elA "," elB ") not found")); } } function check_number(x,name,xmin,xmax) { if (x !~ /^[-+]?[0-9]+$/) { data_error(("bad {" name "} = \"" x "\"")); } # make sure it is tretaed as a number: x = x + 0; if ((x < xmin) || (x > xmax)) { data_error(("value {" name "} = \"" x "\" out of range [" xmin ":" xmax "]")); } return x; } function arg_error(msg) { printf "** argument error: %s\n", msg > "/dev/stderr"; printf " usage: %s\n", USAGE > "/dev/stderr"; exit 1; } function data_error(msg) { printf "%s:%d: %s\n", FILENAME, FNR, msg > "/dev/stderr"; printf " [%s]\n", $0 > "/dev/stderr"; abort = 1; exit abort; }