簡體   English   中英

CSV Bash循環變量問題

[英]CSV Bash loop Issue with Variables

我有一個csv文件,我試圖通過它循環查找是否在csv數據內找到了用戶輸入。 我寫了下面的代碼,有時可能有用,而其他的則無效。 當我嘗試與2位以上的數字進行比較時,它總是會停止工作。 1到9的數字可以正常工作,但是一旦輸入56或99或100,它就會停止工作。

csv數據以逗號分隔,我大約有300行,就像這樣。

1,John Doe,Calculus I,5.0
1,John Doe,Calculus II,4.3
1,John Doe,Physics II,3.5
2,Mary Poppins,Calculus I,3.7
2,Mary Poppins,Calculus II,4.7
2,Mary Poppins,Physics I,3.7

數據就是這樣,一直到ID#100,總共300行。 sh文件和csv文件都在同一文件夾中,我使用的是Ubuntu 12.04.3全新安裝,使用gedit作為文本編輯器。

我嘗試在IF條件條件中回顯變量ID和變量,但它的行為與測試相同值時不同。 有人可以指出我正確的方向。 謝謝

這是代碼:

#s!/bin/bash
echo "enter your user ID";
read user;

INPUT_FILE=notas.csv
while IFS="," read r- ID name asignature final;
do
if [$ID = $user]; then
userType=1;
else
userType=2;
fi
done < notas.csv

您應該在if測試語句中引用變量。 您還應該執行數字test -eq而不是字符串comparison = 因此,您的if語句應類似於:

if [[ "$ID" -eq "$user" ]]

好吧,您編寫的代碼存在一些問題。

  1. 您在read行上使用r-而不是-r我認為您的實際代碼中沒有錯字,否則您不會走得太遠。

  2. 同樣,您需要在[ ... ]方括號內留空格: [$ID是語法錯誤。

  3. 您需要在if子句中引用參數擴展,和/或切換括號類型。 您可能按照@ imp25的建議進行了數值比較,我可以使用(( ... ... ))

  4. 您可能不希望在else子句中將userType設置為2,因為對於每個人,除非文件中最后列出的那個人(ID 100,大概是), else將其設置為2。 您想在循環之外首先將其設置為2。 然后,在循環中找到匹配項時,將其設置為1並退出循環:

     userType=2 while IFS=, read -r ID name asignature final; do if (( $ID == $user )); then userType=1; break fi done < notas.csv 

您也可以只使用諸如awk之類的shell工具:

userType=$(awk -F, -vtype=2 '($1=="'"$user"'") {type=1}; END {print type}' notas.csv)

grep

grep -q "^$user," notas.csv
userType=$(( $? + 1 ))

等等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM