使用shell cut csv file

时间:2015-09-23 07:26:36

标签: shell csv awk

我想按列名剪切CSV文件。

示例文件:

"column A","column B","column C","column D","column E",
aaa,bbb,ccc,ddd,eee,
111,222,333,444,555

column_A:

$ cat column_A
aaa
111

column_B:

$ cat column_B
bbb
222

当我使用awk时,但它没有成功。有些时候我们在\n见到""

像这样:

aaa,ssss,"zzz 
xxx"

但这应该是一条线,我该怎么办? 只是1"它可以成功 但是当csv文件也可能\ n也可能“在线” 它' S 不会成功

function isallline(){
    LineNumber=$1
    LineInfo=`echo "$2"|tr -d '\n'`
    FileName=$3
    LastLineNumber=$4
    GetInfo=`echo "$LineInfo"|awk -F '"' '{print NF-1}'`
    IsAl=$((GetInfo%2))

    if [[ $IsAl != 0 ]]
    then
        LineNumber=$((LineNumber+1))

        LineInfo="$LineInfo""`sed -n ''$LineNumber'p' $FileName|tr -d '\n'`"      

       if [[ $LineNumber -le $LastLineNumber ]]
        then
            isallline $LineNumber "$LineInfo" $FileName $LastLineNumber
        else
            echo "error with not complte'\"'"
        fi

    else
        echo "$LineInfo" >>CSVFile
        return $LineNumber
    fi
}

function GetCsvFile()
{ 
    FileName=$1
    >CSVFile                                                              #-- clearn file --
    i=1                                                                   #-- declare i=1 --
    LasetLineNumber=`wc -l $FileName|awk '{print $1 }'`
    LineNumber=0                                                          #-- declare LineNumber=0 --
    while read LINE                                                       #-- read file --
    do
        getinfo=`echo $LINE|awk -F '"' '{print NF-1}'`                    #-- get count(") --
        if [[ $getinfo != 0 ]] 
        then
           if [[ $LineNumber == 0 ]]
            then 
                isallline $i "$LINE" $FileName LasetLineNumber            #-- call function isallline --
                LineNumber=$?                                             #-- get function isallline return(LineNumber) --
            elif [[ $LineNumber -lt $i ]]
            then
                isallline $i "$LINE" $FileName LasetLineNumber
                LineNumber=$?
            fi
        fi 
        if [[ $i -gt $LineNumber ]]
        then
            echo $LINE >> CSVFile                          
        fi  
    let i++
    done < $FileName
}

1 个答案:

答案 0 :(得分:1)

从理论上讲,可以编写这样的正则表达式,它可以解析CSV。但是here很棒,为什么它或多或少几乎不可能。您最好使用特定的解析器。实际上,几乎所有的linux系统都安装了python而python includes tooling来解析CSV文件