Bash 如何使用shell脚本从csv文件中获取列名

Bash 如何使用shell脚本从csv文件中获取列名,bash,shell,Bash,Shell,有没有一种方法仅仅通过使用shell脚本命令就可以从CVS中提取列名 我有一个如下的csv文件: Name,Age,ID ---------- kart,24,11 ---------- carl,18,45 这是从csv文件读取的代码 head -1 `example.csv` while IFS=',' read f1 f2 f3 if [[ ${#f3} -le 3 ]] then ... ... 如果我的csv文件具有相同顺序的相同列集,但coulmns可能不具有相同顺序,那么这

有没有一种方法仅仅通过使用shell脚本命令就可以从CVS中提取列名

我有一个如下的csv文件:

Name,Age,ID
----------
kart,24,11
----------
carl,18,45
这是从csv文件读取的代码

head -1 `example.csv`

while IFS=',' read f1 f2 f3

if [[ ${#f3} -le 3 ]]
then
...
...
如果我的csv文件具有相同顺序的相同列集,但coulmns可能不具有相同顺序,那么这应该可以正常工作。

为什么不简单地这样做

头-1输入文件 如果在Bash数组中需要它们,那么可以这样做

如果s=','read-a var echo${var[@]} 比如:

{
    IFS=, read -ra header
    while IFS=, read -ra row; do
        if [ "${row##*(-)}" ]; then
            for ((i=0; i<${#header[@]}; i++)) ;do
                echo -n ${header[i]}:=${row[i]}\ 
            done
            echo
        fi
    done
} < example.csv
样品

使用关联数组和排序字段的更复杂示例 甚至:

declare -A Values='()' 
sortedFields=()
{ 
    IFS=, read -ra header
    for i in ${header[@]} ;do
        printf -v iNum %-9s $i
        sortedFields[64#${iNum// /0}]=$i
    done
    sortedHeader=${sortedFields[*]}
    echo ${sortedHeader// /,}
    printf -v fread 'Values[%s] ' ${header[@]}
    while IFS=, read -r $fread; do
        lineOut=()
        if [ "${Values[$header]##*(-)}" ]; then
            echo ${sortedHeader//?/-}
            lineOut=''
            for i in ${sortedFields[@]}; do
                lineOut+=${Values[$i]},
            done
            echo ${lineOut%,}
        fi
    done
} < example.csv

我已经从你的问题中删除了一些无用的信息,但是你仍然需要改进这个问题。您的示例代码甚至不可用。请看一看。
declare -A Values='()' 
sortedFields=()
{ 
    IFS=, read -ra header
    for i in ${header[@]} ;do
        printf -v iNum %-9s $i
        sortedFields[64#${iNum// /0}]=$i
    done
    printf -v fread 'Values[%s] ' ${header[@]}
    while IFS=, read -r $fread; do
        lineOut=()
        if [ "${Values[$header]##*(-)}" ]; then
            for i in ${sortedFields[@]}; do
                echo -n $i:=${Values[$i]}' '
            done
            echo
        fi
    done
} < example.csv
Age:=24 ID:=11 Name:=kart 
Age:=18 ID:=45 Name:=carl 
declare -A Values='()' 
sortedFields=()
{ 
    IFS=, read -ra header
    for i in ${header[@]} ;do
        printf -v iNum %-9s $i
        sortedFields[64#${iNum// /0}]=$i
    done
    sortedHeader=${sortedFields[*]}
    echo ${sortedHeader// /,}
    printf -v fread 'Values[%s] ' ${header[@]}
    while IFS=, read -r $fread; do
        lineOut=()
        if [ "${Values[$header]##*(-)}" ]; then
            echo ${sortedHeader//?/-}
            lineOut=''
            for i in ${sortedFields[@]}; do
                lineOut+=${Values[$i]},
            done
            echo ${lineOut%,}
        fi
    done
} < example.csv
Age,ID,Name
-----------
24,11,kart
-----------
18,45,carl