2016-11-08 44 views
0

我有一個2行CSV文件。 1行是標題,一行是數據。這是從資產數據庫中提取的,同時只爲一項資產查找數據。但是,請注意,CSV文件可能包含不止兩行。BASH:如何使用列標題以單獨的行打印CSV文件

我需要採取CSV(下面的例子)並打印在一個單獨的行上的每個標題條目,匹配的數據輸入在同一行。

樣品CSV數據

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

樣本輸出

head1 data1 
head2 data2 
head3 data3 
head4 data4 

怎麼可以這樣簡單地完成?

回答

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 

編輯我以前的答案。通過嵌套循環,它可以處理多於兩行和多列。

+0

這非常接近,但我簡化了我的帖子中的問題,僅使用2行。如果CSV有兩行以上的內容呢? – Speeddymon

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

這假定靜態數據大小(列數等)。不幸的是,列的數量是動態的,這就是爲什麼我喜歡這樣的輸出。 – Speeddymon

+0

此外,假設我們將提前知道列的數量,我們不會。我已更新原始帖子。 – Speeddymon

0

考慮,我想從文件中讀取的,我不喜歡輸出到另一個文件,我後來不得不清理的想法,所以我去了與關聯數組,這是在BASH V4可用和至多僅與內建命令declare -A

這不會在BASH v3的工作或更低,因爲-A是不是一個有效標誌提供給declare內置。

由於在這個文件中只知道有兩行,所以這是一個相當不好的解決方案,運行良好。可以通過在最後的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,只有在你使用了兩行代碼的情況下才有效。

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個不同的文件作爲輸入。不知道這是從哪裏來的,但我不會將數據分成兩個單獨的文件。 – Speeddymon

+0

@Speeddymon我將所有數據插入到名爲L的文件中,之後我將兩個文件分開並使用粘貼命令 – c4f4t0r