我有一个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
将打印出第一行的各个列组件。我如何为后续行再次执行此操作?
感谢您的时间。
答案 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
是原始文件中的行数。