Bash 如何使用shell脚本从csv文件中获取列名
有没有一种方法仅仅通过使用shell脚本命令就可以从CVS中提取列名 我有一个如下的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可能不具有相同顺序,那么这
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{
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