BASH:如何打印CSV文件,列标题为单独的行

时间:2016-11-08 00:29:07

标签: bash

我有一个2行的CSV文件。 1行是标题,一行是数据。这是从资产数据库中提取的,同时只查找一个资产的数据。但请注意,CSV文件可能只包含2行。

我需要使用CSV(下面的示例)并在单独的行上打印每个标题条目,匹配的数据条目位于同一行。

CSV数据样本

head1,head2,head3,head4
data1,data2,data3,data4

示例输出

head1   data1
head2   data2
head3   data3
head4   data4

如何才能做到这一点?

4 个答案:

答案 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