从csv文件中的特定列号中提取数据

时间:2015-08-19 17:10:15

标签: shell csv

我有一个csv文件,如下所示:

arruba,jamaica, bermuda, bahama, keylargo, montigo, kokomo
80,70,90,85,86,89,83
77,75,88,87,83,85,77
76,77,83,86,84,86,84

我想设置一个shell脚本,以便我可以提取数据,以便我可以按列对数据进行分类。

我知道代码行:

IFS="," read -ra arr <"vis.degrib"
for ((i=0 ; i<${#arr[@]} ; i++));do
     ifname=`printf "%s\n" "${arr[i]}"`
     echo "$ifname"
done

将打印出第一行的各个列组件。我如何为后续行再次执行此操作?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

我从OP推断

 awk -F, 'NR==1{for(i=1;i<=NF;i++) {gsub(/^ +/,"",$i);print $i}}' vis.degrib

将打印

arruba
jamaica
bermuda
bahama
keylargo
montigo
kokomo

请注意,每个字段的开头都会修剪空间。如果删除条件NR==1,则将对所有行执行相同操作。这是你的要求吗?请评论......

也许您想将列式格式转换为基于行的格式(转置)?有很多方法,这个awk脚本会做

 awk -F, -v OFS=, '{sep=(NR==1)?"":OFS} {for(i=1;i<=NF;i++) a[i]=a[i] sep $i} END{for(i=1;i<=NF;i++) print a[i]}' vis.degrib

将打印

arruba,80,77,76
jamaica,70,75,77
 bermuda,90,88,83
 bahama,85,87,86
 keylargo,86,83,84
 montigo,89,85,86
 kokomo,83,77,84

您可以再次从标签的开头修剪空间,如上所示。

没有awk的另一种方法。

 tr ',' '\n' <vis.degrib | pr -4ts,

将生成相同的

 arruba,80,77,76
 jamaica,70,75,77
  bermuda,90,88,83
  bahama,85,87,86
  keylargo,86,83,84
  montigo,89,85,86
  kokomo,83,77,84

4是原始文件中的行数。