【问题标题】:bash read csv file store value into a variablebash 将 csv 文件存储值读取到变量中
【发布时间】:2019-03-17 22:36:55
【问题描述】:

我想使用 Bash 读取 csv 并将每个值存储到一个变量中以供进一步处理。 我的 csv 文件如下所示,所有值都是唯一的。

> val1-row1,val2-row1,val3-row1,val4-row1....valn-row1
> val1-row2,val2-row2,val3-row2,val4-row2....valn-row2

下面是我的代码

 while IFS=, read eachvalue; 
    do
   if [ "$eachvalue" = "something" ]
   then
    echo "do something"
   else
    echo "do something else"
   fi
    done < allvalues.csv

我无法读取每个值并为 csv 文件中的每个值执行 if 条件。谢谢你的帮助。

【问题讨论】:

  • 如果您能告诉我们您的完整要求,我们很可能只需要一个 awk 或 sed 等就可以做到这一点。所以请编辑您的帖子并提供更多详细信息。
  • 我的 csv 文件包含具有多列的唯一值,值中没有引号或破折号。每个值都用逗号分隔。都是唯一值。我想将每个值读入一个变量(仅变量)并检查另一组值(它们来自另一个文件)。如果两者都匹配,我会执行某些回显命令。再次感谢!
  • “唯一变量”是什么意思?如果您正在检查从另一个文件读取的集合,在本机 bash 调用中有效地执行此操作以使用关联数组,或者完全更改您的工具集(如果您专注于吞吐量,完全放弃 bash 并以 100 % awk -- 不是 awk-embedded-in-bash -- 是一个不错的选择)。

标签: bash


【解决方案1】:

IFS=, 仅在您使用read -a 读入数组时有用,或者您为要读取的每一列传递一个变量名。下面,我们做前者:

#!/usr/bin/env bash
#              ^^^^ -- NOT /bin/sh

row_idx=0
while IFS=, read -ra values; do
  for col_idx in "${!values[@]}"; do value=${values[$col_idx]}
    if [ "$value" = something ]; then
      echo "something found on row $row_idx, column $col_idx"
    fi
  done
  (( ++row_idx ))
done

查看运行在https://ideone.com/JN1pK3 的输出(在将something 插入第二行输入后,紧挨着末尾):something found on row 1, column 4(请记住,行和列都是零索引) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多