#!/usr/bin/env bash # csv-to-table.sh — convert a 2-column CSV into Cloverleaf .tbl format. # # Input CSV (with or without header): # input,output # 12345,M # 12346,F # ... # # Output Cloverleaf .tbl: # # Generated by csv-to-table.sh # prologue # who: # date: # outname: output # inname: input # bidir: 0 # type: tbl # version: 7.0 # end_prologue # dflt=__non-existent__ # # # 12345 # M # encoded=0,0 # # # 12346 # F # ... # # Usage: # csv-to-table.sh [FILE] [--default VALUE] [--bidir 0|1] [--has-header] # [--in-delim CHAR] # default ',' # [--user NAME] # default $USER # [--out PATH] # default stdout set -o pipefail usage() { sed -n '2,30p' "$0"; exit 0; } INPUT="" DEFAULT="__non-existent__" BIDIR=0 HAS_HEADER=0 DELIM=',' USER_NAME="${USER:-larry}" OUT_FILE="" while [ $# -gt 0 ]; do case "$1" in --default) shift; DEFAULT="$1" ;; --bidir) shift; BIDIR="$1" ;; --has-header) HAS_HEADER=1 ;; --in-delim) shift; DELIM="$1" ;; --user) shift; USER_NAME="$1" ;; --out) shift; OUT_FILE="$1" ;; -h|--help) usage ;; -*) echo "csv-to-table: unknown flag: $1" >&2; exit 2 ;; *) INPUT="$1" ;; esac shift done [ -z "$INPUT" ] || [ -f "$INPUT" ] || { echo "csv-to-table: no such file: $INPUT" >&2; exit 2; } emit() { cat </dev/null || date) outname: output inname: input bidir: ${BIDIR} type: tbl version: 7.0 end_prologue # dflt=${DEFAULT} # EOF awk -F"$DELIM" -v has_header="$HAS_HEADER" ' NR == 1 && has_header == 1 { next } NF >= 2 { # Trim whitespace gsub(/^[ \t"]+|[ \t"]+$/, "", $1) gsub(/^[ \t"]+|[ \t"]+$/, "", $2) if ($1 == "") next print $1 print $2 print "encoded=0,0" print "#" } ' "${INPUT:-/dev/stdin}" } if [ -n "$OUT_FILE" ]; then mkdir -p "$(dirname "$OUT_FILE")" 2>/dev/null emit > "$OUT_FILE" printf 'csv-to-table: wrote %s\n' "$OUT_FILE" >&2 else emit fi