2017-04-01 71 views
0

我想比较用户输入到这里的文档来比较输入是大于还是小于2的数字(日期),如果是我打印第一列。 我的文件看起来像这样:比较日期到CSV日期范围 - BASH

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

用户可以输入20100215的日期。这里是我的while循环,其比较使用包含一段时间内2个变量读

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 

输出看起来是这样的:您的中国十二生肖是:水

消防

地球

我做不知道为什么while循环会生成多个元素,以及是否有任何可能的解决方案。 谢谢, 基兰

+0

什么问题? – codeforester

+0

我有点失落,我不确定它为什么会输出多个元素。我想知道while循环是否可行,或者我是否应该找到另一种解决方案。 –

+1

因为'echo $ query'。 – codeforester

回答

1

你的问题还是有点不清楚,我有点字里行间这里,但如果我猜对了,你要循环CSV文件中的所有条目,如果$query介于startend之间,您要输出term。但是,如果在循环遍历整个文件之后,如果没有匹配,您试图再次打印查询?

如果是这种情况,那么你正在绊倒循环逻辑。有很多方法可以处理这个问题,但是当执行多个查询时,需要确认是否进行了匹配,最简单的解决方法就是设置一个匹配时切换的标志。然后在完成所有比较之后,您检查标记以查看是否已设置。

一个简单的例子是:

#!/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" 

示例使用/输出

使用CSV文件,你会希望下面的例子结果:

$ 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 

如果我误解你的意图,只要给我一条线,我很乐意进一步帮助。

+0

我用你的脚本来检查错误,结果我的CSV文件充满了它们,我重新创建了一个完美的脚本。谢谢你的帮助大卫,最良好的祝愿。 –

+0

当然,很高兴我能帮上忙。祝你好运,你的脚本。 –