shell脚本读取命令在读取CSV时如何处理未使用的列?

时间:2016-07-28 18:52:15

标签: bash shell

我正在检查用于读取CSV文件然后将数据插入数据库的shell脚本。

该脚本的结构类似于

#!/bin/bash

FILENAME='MyFile.csv'
OLDIFS=$IFS
IFS=,
LINE=0
while read foo bar baz boo
do
    LINE=$(($LINE+1));
    if [ $LINE != 1 ]
    then
        if [ -z "$bar" ]
        then
            bar=-1
        fi
        if [ -z "$baz" ]
        then
            baz=-1
        fi
        if [ -z "$boo" ]
        then
            boo='NULL'
        fi
fi

done <$FILENAME
IFS=$OLDIFS

如果我的CSV文件具有结构

foo, bar, baz, boo, zee, wee
1, 2, 3, 4, 5, 6
7, 8, 9, 10, 11, 12

read如何对最近两列中的不读取做出反应?我假设数据被忽略,在循环的每次迭代中,只有前四列被读入变量?

我也找不到-z语句中if fi的任何信息,我认为它代表&#34;如果值等于零&#34;?

2 个答案:

答案 0 :(得分:3)

来自Bash Manual(强调我的):

  

从标准输入读取一行,或从作为-u选项的参数提供的文件描述符 fd 中读取,并将第一个单词分配给第一个名称,第二个单词指向第二个名称,依此类推,剩余单词及其插入的分隔符分配给最后一个名称

因此,在您的情况下,boo将包含每行的剩余数据。

-z测试也在Bash Conditional Expressions下的Bash手册中进行了描述。简而言之:

  

如果 string 的长度为零,则为真。

答案 1 :(得分:2)

read不会忽略最后两列;它只是提前停止分裂。如果您检查boo的值,则会看到它包含boo, zee, wee之类的值作为其值。你至少还需要一个变量来保持尾随:

while IFS=, read foo bar baz boo everythingelse; do
    ...
done < "$FILENAME"

-z测试字符串参数的长度。要测试零值,您需要使用=(或-eq,如果您知道该字符串看起来像一个整数。)

if [ "$bar" -eq 0 ]; then
    bar=-1
fi

请注意,逗号后面的空格从变量值中删除。第一行bar的值为<space>2,而不是2