]> git.plutz.net Git - confetti/blobdiff - pdiread.sh
date time helper
[confetti] / pdiread.sh
index d774ada3caedba752d1271aa1bc8ceacc662b5d5..e19ceb8d5150c658381ac3d017f54f0f0caa6721 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/zsh
 
-# Copyright 2014 - 2018 Paul Hänsch
+# Copyright 2014 - 2018, 2023 Paul Hänsch
 #
 # This file is part of Confetti.
 # 
@@ -25,6 +25,17 @@ include_pdi="$0"
 
 BR='
 '
+unescape(){
+  local in out=''
+  [ $# -gt 0 ] && in="$*" || in="$(cat)"
+  while [ "$in" ]; do case $in in
+    \\\\*) out="${out}\\"; in="${in#\\\\}" ;;
+    \\n*) out="${out}${BR}"; in="${in#\\n}" ;;
+    \\*) in="${in#\\}" ;;
+    *) out="${out}${in%%[\\]*}"; in="${in#"${in%%[\\]*}"}" ;;
+  esac; done
+  printf '%s\n' "$out"
+ }
 
 pdi_load() {
   # normalise PDI file for processing with pdi_* functions
@@ -32,7 +43,7 @@ pdi_load() {
   # Usage example:
   # data="$(pdi_load file.vcf)"
 
-  sed -En '
+  sed -srn '
     # === Read entire file into buffer ===
     :X $bY; N; bX; :Y s;^.*$;\n&\n;;
 
@@ -56,7 +67,7 @@ pdi_load() {
 
     # === Unscramble aggregated fields ===
     :disag
-    s;\n([^:]+:)((.*[^\])?(\\\\)*),;\n\1\2\n\1;;
+    s;\n([^:\n]+:)(([^\n]*[^\])?(\\\\)*),;\n\1\2\n\1;;
     t disag;
 
     # === Insert FN when only N is present ===
@@ -100,7 +111,7 @@ pdi_load() {
     # === Update obsolete LABEL property ===
     s;\nLABEL((\;[A-Za-z0-9-]+|\;[A-Za-z0-9-]+=([^;,:"]+|"[^"]+")(,[^;,:"]+|,"[^"]+")*)*):(.*)\n;\nADR\1\;LABEL="\5":\n;g;
 
-    p;' "$1"
+    p;' "$@"
 }
 
 pdi_count(){
@@ -114,13 +125,31 @@ pdi_count(){
 }
 
 pdi_attrib(){
-  local card=":$1" name="$2" cnt="${3:-1}"
+  local card=":$1" name="$2" cnt="${3:-1}" attr="$4"
   while [ $cnt -gt 0 ]; do
     [ "${card#*${BR}${name};}" = "$card" ] && return 1
     card="${card#*${BR}${name};}"
     cnt=$((cnt - 1))
   done
-  printf %s\\n "${card%%:*}"
+  card="${card%%:*}"
+  if [ "$attr" ]; then
+    case $card in
+      *\;"$attr"=*) card="${card#*;${attr}=}";;
+      "$attr"=*) card="${card#${attr}=}";;
+      "$attr"|*\;"$attr"|"$attr"\;*|*\;"$attr"\;*) return 0;;
+      *) return 1;;
+    esac
+    case $card in
+      \"*\"\;*|\'*\'\;*)
+        card="${card#[\"\']}"; card="${card%%[\"\'];*}"
+        ;;
+      \"*\"|\'*\')
+        card="${card#[\"\']}"; card="${card%%[\"\']}"
+        ;;
+      *\;*) card="${card%%;*}";;
+    esac
+  fi
+  printf %s\\n "${card}"
 }
 
 pdi_value(){