簡體   English   中英

BASH:如何將CSV文件與列標題分開顯示

[英]BASH: How to print CSV file out with column headers as separate lines

我有一個2行CSV文件。 標題是1行,數據是1行。 這是從資產數據庫中提取的,而僅查找一項資產的數據。 但是,請注意,CSV文件可能包含不止2行。

我需要采用CSV(以下示例)並將每個標頭條目打印在單獨的行上,並將匹配的數據條目打印在同一行上。

樣本CSV數據

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

樣品輸出

head1   data1
head2   data2
head3   data3
head4   data4

如何簡單地做到這一點?

#!/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

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

僅使用純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) )

鑒於我想從文件中讀取內容,我不喜歡將輸出輸出到另一個文件的想法,以后我必須清理它,因此我選擇了一個關聯數組,該數組在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

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM