• # un peu de sh

    Posté par (site web personnel, Mastodon) . En réponse au message Avent du Code, jour 4. Évalué à 1. Dernière modification le 12 décembre 2022 à 01:39.

    Pour la première partie.

    #!/bin/sh
    # 1ドル: input file
    for c in 'grep' 'seq' 'test'
    do
     if ! command -v "$c" >/dev/null
     then
     echo "Error: command '$c' not found" >&2
     exit 3
     fi
    done
    if test -z "1ドル"
    then
     echo "Please call me with an input file..." >&2
     exit 1
    fi
    if grep -Eqsv '^[0-9]+-[0-9]+,[0-9]+-[0-9]+$' "1ドル"
    then
     echo "Found invalid line, check the file!" >&2
     exit 2
    fi
    _if="1ドル"
    # First or Second elves in paire
    # Start or End of section number
    _oc=0 # Overlap Counter
    while IFS='-,' read -r _fs _fe _ss _se <&3
    do
     _s1=",$( seq -s ',' $_fs $_fe )" # 1st range sections list
     _s2=",$( seq -s ',' $_ss $_se )" # 2nd range sections list
     if test -z "${_s1##*$_s2*}" ||
     test -z "${_s2##*$_s1*}"
     then
     _oc=$(( _ic + 1 ))
     fi
    done 3<"$_if"
    echo "$_oc"

    Je ne sais pas pourquoi ça m'a fait penser à seq et jot (que j'ai déjà eu à mentionner.)

     _s1=",$( jot -s ',' - $_fs $_fe )," # 1st range sections list
     _s2=",$( jot -s ',' - $_ss $_se )," # 2nd range sections list

    L'écriture en extension a été inspiré par l'exemple donné

    .234..... 2-4
    .....678. 6-8

    ...mais j'utilise un séparateur car on peut avoir des nombre de plusieurs chiffres

    ,2,3,4, 2-4
    ,6,7,8, 6-8

    Après il suffit de vérifier qu'une des deux sous-chaines est dans l'autre. :)
    Ici j'ai utilisé les possibilités de substitution et expansion du shell, mais on peut faire appel à une autre commande pour plus de lisibilité.

     if echo "$_s2" | grep -qs "$_s1"
     then
     _oc=$(( _ic + 1 ))
     elif echo "$_s1" | grep -qs "$_s2"
     then
     _oc=$(( _ic + 1 ))
     fi

    Noter que l'on peut utiliser seq et jot sans option -s puis rediriger dans un fichier distinct puis appliquer comm aux deux fichiers comme déjà vu.
    Exceptionnellement, je mentionne deux commandes non POSIX mais répandues (cependant la syntaxe du script demeure sans bashism.) On peut remplacer par une fonction maison pour plus de portabilité.
    Dans tous les cas, on traite le problème en peu de lignes avec les outils disponibles. :)

    "It is seldom that liberty of any kind is lost all at once." ― David Hume