[英]How to replace a column of a CSV file with lines from another file in BASH?
[英]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.