如何在bash中读取单列CSV文件?

时间:2014-06-27 18:59:37

标签: bash csv

一般来说,我对bash /编程比较陌生。

我有一个单列CSV,如下所示:

domain1.com
domain2.com
domain3.com
domain4.com

我希望浏览每个条目并使用它执行某些操作。这是我的代码:

foo(){
i=0
  while read -a line; 
    do
      echo ${line[i]}
      ((i++))
    done < myfile.csv 
}

没有任何反应。我已经想通了,如果我改变我指向的文件:

done< <(grep '' myfile.csv)

它会起作用,但只会吐出CSV的最后一行,如下所示:

domain4.com 

同样,我是一名初学者并自学这些东西,所以你想要给出的任何解释都会非常感激!

编辑因此,我的新问题似乎是从我的CSV文件中删除^ M字符。一旦我弄清楚如何做到这一点,我会在这里标出适合我的答案。

4 个答案:

答案 0 :(得分:3)

如果您想将线条存储在阵列上,您只需执行以下操作:

readarray -t lines < file

而且,如果您想尝试处理这些行,您可以使用

for line in "${lines[@]}"; do
    echo "$line"
done

或通过索引(记住!):

for i in "${!lines[@]}"; do
    echo "${lines[i]}"
done

指数从0开始。

答案 1 :(得分:2)

while read p; do
  echo $p
done < myfile.csv

答案 2 :(得分:1)

看起来你有2个问题:

  1. 您的行以\r
  2. 结尾
  3. 最后一行末尾没有新行或\r
  4. 要解决此问题,请使用以下脚本:

    echo >> file.csv
    while read -r line; do echo "$line"; done < <(tr '\r' '\n' < file.csv)
    

答案 3 :(得分:0)

您也可以使用以下命令将文件读入数组:

array=( `<file` )

如果您需要使用数字索引,则可以使用以下命令访问元素:

for ((i=0;i<${#array[@]};i++))
    printf " array [%2d]: %s\n" "$i" "${array[$i]}"
done