从bash脚本文件读取csv文件

时间:2019-03-12 23:59:52

标签: linux bash csv terminal

在一个文件夹中,我有2个文件。 Valuation.csv和另一个文件myScript.sh

我的CSV文件有10行5列。我已经尝试过多次阅读,但从未成功。这是我在myScript.sh中尝试作为代码进行的尝试:

第一次尝试:

#!/bin/bash

    while read -r line do
        field1=$(echo $line | awk -F'|' '{printf "%s", $1}' | tr -d '"')
        field2=$(echo $line | awk -F'|' '{printf "%s", $2}' | tr -d '"')

        echo $field1 $field2 done < $Valuation.csv

结果:/myScript.sh:第10行:.csv:没有此类文件或目录

第二次尝试:

cat Valuation.csv|while read line   do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"   done

结果:什么都没有

我正在运行如下文件:

./ myScript.sh

谢谢

Here the csv file opened with excel

2 个答案:

答案 0 :(得分:0)

这是我的文件data.csv

Site,Post,Subject,User,Status
stackover flow,bash,read csv,James,ok
git,linux,core,Novy,ko

在我的bash脚本中,我有类似的东西:

#!/bin/bash
INPUT=./data.csv
OLDIFS=$IFS
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read site post subject usr status
do
    echo "Site : $site"
    echo "Post : $post"
    echo "Subject : $subject"
    echo "User : $usr"
    echo "Status : $status"
done < $INPUT
IFS=$OLDIFS

输出

站点:堆栈溢出流 帖子:bash 主题:阅读csv 用户:詹姆斯 状态:确定 网站:git 帖子:Linux 主题:核心 用户:Novy 状态:ko

您可以看一下here

答案 1 :(得分:0)

James,避免在bash中的循环内调用实用程序。那是非常低效的。避免使用固定数量的字段-如果添加另一个字段怎么办?您只需使用.csv并将内部字段分隔符设置为逗号分隔(例如read -a array...),就可以非常轻松地读取bash中的IFS=$',\n'数据。

例如,编写一个使用.csv文件名作为第一个参数读取的脚本,您可以这样做:

#!/bin/bash

declare -i row=0

while IFS=$',\n' read -r -a array; do
    printf "row %d - read %d fields.\n" $((row++)) ${#array[@]}
    for i in "${array[@]}"; do
        printf " %-12s" "$i"
    done
    echo ""
done < "$1"

注意:,虽然您可能会想在awk中处理整个问题,但由于这似乎是bash练习,因此对于短.csv文件来说, bash胜过一切)

示例数据

(我不想重新输入您的电子表格,所以这里是前两行)

$ cat company.csv
Facebook,35587,55800000000,1567988,491000000000,8.80x
Uber,16000,11300000000,706250,120000000000,10.6x

运行脚本并仅输出行数和每行字段,然后输出字段值本身,您将得到:

$ bash readcsv.sh company.csv
row 0 - read 6 fields.
 Facebook     35587        55800000000  1567988      491000000000 8.80x
row 1 - read 6 fields.
 Uber         16000        11300000000  706250       120000000000 10.6x

仔细研究一下,如果您有任何疑问,请告诉我。