我正在尝试阅读具有此格式的电子表格
username, lastname, firstname, x1, x2, x3, x4
user1, dudette, mary, 7, 2, 4
user2, dude, john, 6, 2, 4,
user3, dudest, rad,
user4, dudaa, pad, 3, 3, 5, 9
基本上,它具有用户名,用户名对应的名称以及每个x的值。我想要做的是从csv文件中读取,然后找到所有空格并用5s填充它们。我这样做的方法是读入整个数组,然后用0替换所有null空格。到目前为止这是代码......
我得到的解决方案,感谢stackoverflow的另一位受访者,
n=5
while IFS=, read username lastname firstname x1 x2 x3 x4; do
! [[ $x1 ]] && x1=$n
! [[ $x2 ]] && x2=$n
! [[ $x3 ]] && x3=$n
! [[ $x4 ]] && x4=$n
echo $username,$lastname,$firstname,$x1,$x2,$x3,$x4
done < something.csv > newfile.csv && mv newfile.csv something.csv
在过去的几个小时里,我一直在试图找出如何将其扩展为n列案例。所以在上面的例子中,我知道我有7列,所以我读了七个变量。我现在要做的是弄清楚如何将它扩展到n列的情况。即使添加了另一列,我仍然需要代码才能工作。
答案 0 :(得分:1)
awk更适合这种类型的csv解析和格式化。
awk -F '[, ]+' -v n=7 '{for (i=1; i<=n; i++) printf "%10s%s", $i, (i<n)?OFS:RS}' OFS=, x
username, lastname, firstname, x1, x2, x3, x4
user1, dudette, mary, 7, 2, 4,
user2, dude, john, 6, 2, 4,
user3, dudest, rad, , , ,
user4, dudaa, pad, 3, 3, 5, 9
答案 1 :(得分:0)
Anubhava的回答应该更快(因为它是awk,而不是bash)。我正在添加一个答案,仅仅是为了回答有关如何将read
扩展到n列的问题。
n=5
while IFS=, read -a columns; do
for i in ${!columns[@]}; do # * NOTE1
[ "${columns[$i]}" ] || columns[$i]=$n
done
printf "%s" ${columns[0]}; printf ",%s" ${columns[@]:1} # * NOTE2
done < something.csv > newfile.csv && mv newfile.csv something.csv
注1:如果条目为空,但存在占位符,请按原样使用for循环。
如果csv文件中的列数未修复(例如,检查user3行),则将内部for循环更改为for ((i=0;i<$max_columns;i++)); do
注2:如果需要,在printf命令中,将%s
更改为%10s
。