#!/bin/bash set -euo pipefail transcode() { local file if (( $# == 0 )); then iconv -f EUC-JP -t UTF-8 return fi for file in "$@"; do iconv -f EUC-JP -t UTF-8 "$file" printf '\n' done } transcode "$@" | awk ' function fail(s) { print "skk2ktrans: " FILENAME ":" FNR ": " s >"/dev/stderr" bad = 1 exit 1 } function add(k, v, id) { sub(/;.*/, "", v) if(v == "" || v ~ /^[([#]/ || v ~ /[[:space:]]/) return id = k SUBSEP v if(seen[id]) return seen[id] = 1 if(!(k in row)) order[++nkey] = k else row[k] = row[k] " " row[k] = row[k] v } /^;;/ { if(!body) # the header, with its license notice, is kept print next } /^[[:space:]]*$/ { next } { body = 1 if(!match($0, /[[:space:]]+/)) fail("missing candidate list") key = substr($0, 1, RSTART-1) field = substr($0, RSTART+RLENGTH) if(key == "" || key ~ /^;/ || field !~ /^\/.*\/$/) fail("invalid row") if(field ~ /\\/) fail("escaped candidates are unsupported") if(field ~ /\/[([#]/) fail("expression candidates are unsupported") n = split(substr(field, 2, length(field)-2), value, "/") for(i = 1; i <= n; i++) add(key, value[i]) } END { if(bad) exit 1 for(i = 1; i <= nkey; i++) print order[i] "\t" row[order[i]] } '