__zplug::utils::awk::path() { local awk_path local -a awk_paths local awk variant # Look up all awk from PATH for awk_path in ${^path[@]}/{g,n,m,}awk do if [[ -x $awk_path ]]; then awk_paths+=( "$awk_path" ) fi done # There is no awk execute file in this PATH if (( $#awk_paths == 0 )); then __zplug::log::write::error \ "gawk or nawk is not found" return 1 fi # Detect awk variant from available awk list for awk_path in "${awk_paths[@]}" do if ${=awk_path} --version 2>&1 | grep -q "GNU Awk"; then # GNU Awk variant="gawk" awk="$awk_path" # Use gawk if it's already installed break elif ${=awk_path} -Wv 2>&1 | grep -q "mawk"; then # mawk variant=${variant:-"mawk"} echo $awk:$variant else # nawk variant="nawk" awk="$awk_path" # Search another variant if awk is nawk continue fi done if [[ $awk == "" || $variant == "mawk" ]]; then __zplug::log::write::error \ "gawk or nawk is not found" return 1 fi echo "$awk" } __zplug::utils::awk::available() { local awk_path __zplug::utils::awk::path \ | read awk_path # AWK is available if [[ -n $awk_path ]]; then return 0 else return 1 fi } __zplug::utils::awk::ltsv() { local \ user_awk_script="$1" \ ltsv_awk_script ltsv_awk_script=$(cat <<-'EOS' function key(name) { for (i = 1; i <= NF; i++) { match($i, ":"); xs[substr($i, 0, RSTART)] = substr($i, RSTART+1); }; return xs[name":"]; } EOS ) awk -F'\t' \ "${ltsv_awk_script} ${user_awk_script}" }