【问题标题】:CSV Bash loop Issue with Variables带有变量的 CSV Bash 循环问题
【发布时间】:2013-11-05 03:00:54
【问题描述】:

我有一个 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

【问题讨论】:

  • 你的意思是-r,而不是r-

标签: linux bash loops csv


【解决方案1】:

好吧,您编写的代码存在一些问题。

  1. 您在 read 行中有 r- 而不是 -r - 我认为这是您的实际代码中不存在的错字,否则您不会走得太远。

  2. 同样,[...] 括号周围需要空格:[$ID 是语法错误。

  3. 您需要在if 子句中引用参数扩展,和/或切换括号类型。您可能会按照@imp25 的建议进行数字比较,我会使用((...))

  4. 您可能不希望在 else 子句中将 userType 设置为 2,因为这将对除文件中最后列出的人(大概是 ID 100)之外的每个人都设置为 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 ))

等等

【讨论】:

    【解决方案2】:

    您应该在 if 测试语句中引用您的变量。您还应该执行数字测试-eq,而不是字符串比较=。所以你的if 声明应该是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多