Je tente de lire un fichier, ligne par ligne, et à chaque itération, vérifie le cinquième élément du tableau, qui sera un caractère + ou – (plus ou moins). Je suis capable de lire le fichier ligne par ligne, mais je ne peux pas obtenir la déclaration if / else à reconnaître le +/-.
Code Bash j’ai écrit
#!/bin/bash # save the field separator old_IFS=$IFS while IFS=$'\t' read -r -a myArray do echo "${myArray[5]}" if [ $myArray[5] = "+" ]; then echo plus elif [ $myArray[5] = "-" ]; then echo minus else echo no fi done < /Users/Alex/Desktop/test.bed # restore default field separator IFS=$old_IFS
Entrée de l’échantillon
Scaffold1 34 39 name . - Scaffold1 12 17 name . - Scaffold1 17 12 name . + Scaffold1 43 49 name . + Scaffold1 45 48 name . -
Sortie de l’échantillon
- no - no + no + no - no
Sous chaque +/-, il devrait dire plus ou moins mais au lieu de cela, il indique non, indiquant que les instructions conditionnelles ont échoué. Une fois cette sortie correctement, je vais changer les commandes d’écho pour faire de l’arithmétique sur la colonne 2 ou 3 en fonction du signe.
Vous avez besoin:
${myArray[5]}
Ne pas:
$myArray[5] # this is equivalent to "${myArray[0]}[5]"
Au fait, considérez une déclaration de case
à la place:
case ${myArray[5]} in -) echo minus ;; +) echo plus ;; *) echo no ;; esac
Vous pouvez également éviter le besoin d’un tableau – et rendre ainsi votre code compatible POSIX sh – en utilisant des arguments nommés à read
pour chaque colonne:
while IFS=$'\t' read -r scaffold num1 num2 name dot col _; do : "$col" refers to your fifth column here done