• [^] # Re: un peu de sh

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

    Pour la seconde partie ce fut un peu plus tricky car il faut trouver un moyen de comparer deux listes ou tableaux (première idée qui m'est venue.) J'ai initialement pensé à faire appel à dc mais c'est plutôt cryptique en plus d'être lent.
    Finalement, on peut partir sur la dernière piste précédemment évoquée.

    #!/bin/sh
    # 1ドル: input file
    for c in 'comm' '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
    _s1=$( mktemp ) # 1st range sections list
    _s2=$( mktemp ) # 2nd range sections list
    _oc=0 # Overlap Counter
    while IFS='-,' read -r _fs _fe _ss _se <&3
    do
     seq $_fs $_fe >"$_s1"
     seq $_ss $_se >"$_s2"
     if test -n "$( comm -12 "$_s1" "$_s2" )"
     then
     _oc=$(( _oc + 1 ))
     fi
    done 3<"$_if"
    rm "$_s1" "$_s2"
    echo "$_oc"

    Il est à noter que, comme pour pierre-feuille-ciseau, il est possible d'utiliser l'évaluation arithmétique du shell.

    _oc=0 # all Overlap Counter
    while IFS='-,' read -r _fs _fe _ss _se <&3
    do
     _oc=$(( _oc + !( (_ss>_fe) || (_fs>_se) ) ))
    done 3<"$_if"
    echo "$_oc"

    Maintenant paye ton moins.

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