【问题标题】:Compare date to range of dates in CSV - BASH将日期与 CSV 中的日期范围进行比较 - BASH
【发布时间】:2017-08-26 09:38:11
【问题描述】:

我正在尝试将用户输入与此处的文档进行比较,以比较输入是否大于或小于 2 个数字(日期),如果是,则打印第一列。 我的文件如下所示:

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

用户可以输入 20100215 作为日期。这是我的 while 循环,它使用包含在 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 循环会生成多个元素,以及是否有任何可能的解决方案。 谢谢, 基兰

【问题讨论】:

  • 有什么问题?
  • 我有点迷茫,不知道为什么会输出多个元素。我想知道 while 循环是否有效,或者我是否应该找到另一个解决方案。
  • 因为echo $query.
  • 您正在提交 UUOC(不必要地使用 Cat)。每当您发现自己在执行cat ... 时实际上并未连接 两个(或更多)文件时,它可能是一个UUOC。更好的是,while ...; do ... done &lt;chzod(假设 chzod 是您的数据文件)

标签: bash csv while-loop heredoc


【解决方案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

如果我误解了您的意图,请给我留言,我很乐意为您提供进一步的帮助。

【讨论】:

  • 我使用您的脚本检查错误,结果发现我的 CSV 文件充满了错误,我重新创建了它,脚本运行良好。谢谢你的帮助,大卫,祝你好运。
  • 当然,很高兴我能帮上忙。祝你的脚本好运。
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多