如何解决如何使用Shell脚本从csv文件获取列名
有没有一种方法可以仅使用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文件以相同的顺序具有相同的列集,但此列可能不是以相同的顺序,这应该可以正常工作。
解决方法
类似的东西:
{
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
将呈现:
Name:=kart ID:=11 Age:=24
Name:=carl ID:=45 Age:=18
样品!
使用关联数组和排序字段
的更复杂的示例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
,
为什么不简单地这样呢?
head -1 inputfile
如果您需要在Bash数组中使用它们,则可以
IFS=',' read -a var < inputfile
并通过测试结果
echo ${var[@]}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。