BEGIN { FS=OFS="\t"; number="^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?$" } function fail(message) { print "input error: " message > "/dev/stderr"; failed=1; exit 2 } NR==1 { if ($0!="sample_id\tgroup\tvalue\tstatus") fail("line 1: expected sample_id, group, value, status TSV header") print; next } { if (NF!=4) fail("line " NR ": expected 4 tab-separated fields, got " NF) if ($1 !~ /^[A-Za-z][A-Za-z0-9_-]*$/) fail("line " NR ": invalid sample_id") if (seen[$1]++) fail("line " NR ": duplicate sample_id " $1) if ($2 !~ /^[A-Z][A-Z0-9_]*$/) fail("line " NR ": group must be an uppercase ASCII identifier") if ($4!="valid" && $4!="invalid") fail("line " NR ": unexpected status " $4) if ($3!="NA" && $3 !~ number) fail("line " NR ": value must be a finite decimal number or NA") if ($3!="NA" && (($3+0)>1000000 || ($3+0)<-1000000)) fail("line " NR ": absolute value exceeds 1000000 a.u.") print } END { if (!failed && NR==0) fail("empty input: expected TSV header") }