2016-11-08 12 views
0

2行のCSVファイルがあります。 1行はヘッダ、1行はデータです。これは資産データベースから引き出され、1つの資産だけのデータが検索されました。ただし、CSVファイルには2行以上しか含まれていない可能性があります。BASH:列ヘッダーを別々の行としてCSVファイルを出力する方法

CSV(下記の例)を使用して、別の行に各ヘッダーエントリを印刷し、一致するデータエントリを同じ行に出力する必要があります。

サンプルCSVデータ

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

サンプル出力

head1 data1 
head2 data2 
head3 data3 
head4 data4 

どのようにこれを簡単に行うことができますか?唯一の純粋なbashのでは

答えて

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 

私の以前の回答を編集しました。ループをネストすることにより、2行以上の複数の列を処理します。

+0

これはかなり近いですが、私は2行のみを使用するように投稿を簡略化しました。 CSVに2行以上がある場合はどうなりますか? – Speeddymon

0

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)) 
+0

静的なデータサイズ(列の数など)を前提としています。残念ながら、列の数は動的なので、私はこのような出力を好みます。 – Speeddymon

+0

さらに、これは、事前に列の数を知っていることを前提としています。元の投稿を更新しました。 – Speeddymon

0

は、私は、私は、後にクリーンアップする必要があります別のファイルへの出力のアイデアを好きではなかったファイルから読み込むたかったことを考えると、それゆえ私は行ってきました-Adeclare組み込みに有効フラグないようだけ組み込みコマンドでアップdeclare -A

BASHのV4で利用可能で、連想配列、とこれはBASHのV3以下では動作しないであろう。

このファイルには2行しか存在しないことがわかっているので、これはうまく動作するかなり醜い解決策です。追加の行に対応するように変更することもできますが、最後のforループ内に入れ子になったforループを追加することで、出力時に行幅と行折り返しで他の問題に遭遇する可能性があります。

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 
0

bashを使用すると、これは2行の場合にのみ機能します。

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 
+0

これは2つの異なるファイルを入力として使用しています。それはどこから来たのか分かりませんが、データを2つの別々のファイルに分割しているわけではありません。 – Speeddymon

+0

@Speeddymon Lという名前のファイルにすべてのデータを挿入した後、2つのファイルに分割して貼り付けコマンドを使用しました。 – c4f4t0r

関連する問題