我有一个2行的CSV文件。 1行是标题,一行是数据。这是从资产数据库中提取的,同时只查找一个资产的数据。但请注意,CSV文件可能只包含2行。
我需要使用CSV(下面的示例)并在单独的行上打印每个标题条目,匹配的数据条目位于同一行。
CSV数据样本
head1,head2,head3,head4
data1,data2,data3,data4
示例输出
head1 data1
head2 data2
head3 data3
head4 data4
如何才能做到这一点?
答案 0 :(得分:1)
#!/bin/bash
while { read -r line1; read -r line2; } do
IFS=', ' read -r -a array1 <<< "$line1"
IFS=', ' read -r -a array2 <<< "$line2"
for index in "${!array1[@]}"
do
echo "${array1[index]} ${array2[index]}"
done
done < $1
编辑我之前的回答。通过嵌套循环,它可以处理两行以上和多列。
答案 1 :(得分:0)
仅限纯粹的bash:
while IFS=", " read a b c d e f g h;do echo -e "$a\t$e\n$b\t$f\n$c\t$g\n$d\t$h";done <<< $(echo $(<data.csv) )
答案 2 :(得分:0)
鉴于我想从一个文件读入,我不喜欢输出到另一个文件的想法,我后来要清理它,因此我选择了一个关联数组,可以在BASH v4及以上版本中使用仅使用内置命令-A
这在BASH v3或更低版本中不起作用,因为declare
不是NF=$(awk -F, 'NR==1{print NF}' temp.txt)
declare -A temparray
for ((i=1;i<=$NF;++i))
do
temparray[0,$i]+="$(awk -v VAR=$i -F, 'NR==1{print $VAR}' temp.txt)"
done
for ((i=1;i<=$NF;++i))
do
temparray[1,$i]+="$(awk -v VAR=$i -F, 'NR==2{print $VAR}' temp.txt)"
done
for ((i=1;i<=$NF;++i))
do
printf "%-45s %s\n" "${temparray[0,$i]}" "${temparray[1,$i]}"
done
unset temparray
内置的有效标记。
由于此文件中只有2行知道,这是一个相当难看的解决方案,效果很好。可以通过在最终for循环中添加嵌套for循环来修改它以容纳额外的行,然后在输出时遇到线宽和换行的其他问题。
.factory('Eventos', function($http){
var eventos = [];
return {
all : function() {
return $http.get("eventos.json").then(function(response) {
eventos = response;
return eventos;
});
},
get : function(eventoId) {
for(i = 0; i < eventos.length; i++) {
if(eventos[i].id === eventoId){
return eventos[i];
}
}
return null;
}
}});
答案 3 :(得分:0)
使用bash,这只适用于两行。
n=0
while read line;do echo ${line//,/\\n} > file$n ; let n++;done < L
paste file0 file1
head1 data1
head2 data2
head3 data3
head4 data4