2017-04-01 1 views
0

J'essaie de comparer l'entrée de l'utilisateur à un doc ici pour comparer si l'entrée est supérieure ou inférieure à 2 chiffres (dates), et si c'est j'imprime la première colonne. Mon fichier ressemble à ceci:Comparer la date à la plage de dates dans CSV - BASH

Earth,19480210,19490228 
Earth,19490229,19500216 
Metal,19500217,19510205 
utilisateur

pourrait entrer 20100215 la date. Voici ma boucle while qui compare l'aide de 2 variables contenues dans un while read

while IFS=, read -r term start end; do 
if [[ $query -ge $start && $query -le $end ]];then 
    echo $term 
fi 
    echo $query 
    exit 
done << EOF 
$(cat chzod) 
EOF 

La sortie ressemble à ceci: Votre zodiac chinois est: L'eau

Feu

Terre

je Je ne sais pas pourquoi la boucle while génère plusieurs éléments, et s'il y a des solutions possibles à cela. Merci, Kieran

+0

Quelle est la question? – codeforester

+0

Je suis un peu perdu, et je ne suis pas sûr de savoir pourquoi il produit plusieurs éléments. Je veux savoir si la boucle while va fonctionner, ou si je devrais trouver une autre solution. –

+1

En raison de 'echo $ query'. – codeforester

Répondre

1

Votre question est encore un peu clair, et je lis un peu entre les lignes, mais si je devine bien, vous voulez faire une boucle sur toutes les entrées dans le fichier CSV, et si le $query se situe entre start et end, vous souhaitez afficher term. Mais, si après avoir bouclé le fichier entier, si aucune correspondance n'est faite, vous essayez d'imprimer à nouveau la requête?

Si c'est le cas, vous êtes en train de trébucher sur la logique de la boucle. Il existe plusieurs façons de gérer cela, mais lors de l'exécution de plusieurs requêtes, dont vous devez confirmer la correspondance, la solution la plus simple consiste simplement à définir un indicateur que vous basculez lorsqu'une correspondance est établie. Ensuite, après avoir terminé toutes les comparaisons, vous vérifiez le drapeau pour voir s'il a été défini.

Un exemple rapide serait:

#!/bin/bash 

fname="${1:-chzod}" # take csv file as first argument (default: chzod) 

printf "query: "  # prompt for query 
read -r query 

test -z query && exit # validate query 

declare -i matched=0 # declare matched flag, set to '0' 

while IFS=, read -r term start end; do 
    if [[ $query -ge $start && $query -le $end ]];then 
     echo $term 
     matched=1  # set 'matched' flag 
    fi 
done < "$fname"  # redirect CSV file into loop 

# check 'matched' flag and if unset, output unmatched query 
test "$matched" -eq '0' && echo "unmatched query: $query" 

Exemple d'utilisation/sortie

Utilisation de votre fichier CSV, vous attendez les résultats exemple suivant:

$ bash readearth.sh dat/earth.dat 
query: 19490229 
Earth 

$ bash readearth.sh dat/earth.dat 
query: 19510204 
Metal 

$ bash readearth.sh dat/earth.dat 
query: 20100215 
unmatched query: 20100215 

Si je mal interprété votre intention, il suffit de me laisser tomber une ligne et je suis heureux d'aider plus loin.

+0

J'ai utilisé votre script pour vérifier les erreurs et il s'avère que mon fichier CSV était plein d'entre eux, je l'ai recréé et le script fonctionne parfaitement. Merci pour votre aide David, meilleurs voeux. –

+0

Bien sûr, content que je puisse vous aider. Bonne chance avec vos scripts. –