比较日期到CSV日期范围 - BASH
我想比较用户输入到这里的文档来比较输入是大于还是小于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循环会生成多个元素,以及是否有任何可能的解决方案。 谢谢, 基兰
你的问题还是有点不清楚,我有点字里行间这里,但如果我猜对了,你要循环CSV文件中的所有条目,如果$query
介于start
和end
之间,您要输出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
如果我误解你的意图,只要给我一条线,我很乐意进一步帮助。
我用你的脚本来检查错误,结果我的CSV文件充满了它们,我重新创建了一个完美的脚本。谢谢你的帮助大卫,最良好的祝愿。 –
当然,很高兴我能帮上忙。祝你好运,你的脚本。 –
什么问题? – codeforester
我有点失落,我不确定它为什么会输出多个元素。我想知道while循环是否可行,或者我是否应该找到另一种解决方案。 –
因为'echo $ query'。 – codeforester