2017-04-01 57 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

當然,很高興我能幫上忙。祝你好運,你的腳本。 –