我嘗試按如下方式垂直讀取 csv 檔案以插入石墨/碳 DB。
"No.","time","00:00:00","00:00:01","00:00:02","00:00:03","00:00:04","00:00:05","00:00:06","00:00:07","00:00:08","00:00:09","00:00:0A"
"1","2021/09/12 02:16",235,610,345,997,446,130,129,94,555,274,4
"2","2021/09/12 02:17",364,210,371,341,294,87,179,106,425,262,3
"3","2021/09/12 02:18",297,343,860,216,275,81,73,113,566,274,3
"4","2021/09/12 02:19",305,243,448,262,387,64,63,119,633,249,3
"5","2021/09/12 02:20",276,151,164,263,315,86,92,175,591,291,1
"6","2021/09/12 02:21",264,343,287,542,312,83,72,122,630,273,4
"7","2021/09/12 02:22",373,157,266,446,246,90,173,90,442,273,2
"8","2021/09/12 02:23",265,112,241,307,329,64,71,82,515,260,3
"9","2021/09/12 02:24",285,247,240,372,176,92,67,83,609,620,1
"10","2021/09/12 02:25",289,964,277,476,356,84,74,104,560,294,1
"11","2021/09/12 02:26",279,747,227,573,569,82,77,99,589,229,5
"12","2021/09/12 02:27",338,370,315,439,653,85,165,346,367,281,2
"13","2021/09/12 02:28",269,135,372,262,307,73,86,93,512,283,4
"14","2021/09/12 02:29",281,207,688,322,233,75,69,85,663,276,2
...
我希望為每個列標題 00:00:XX 生成命令,同時考慮列 $2 中的小時數和這段時間內的值
echo "perf.$type.$serial.$object.00:00:00.TOTAL_IOPS" "235" "epoch time (2021/09/12 02:16)" | nc "localhost" "2004"
echo "perf.$type.$serial.$object.00:00:00.TOTAL_IOPS" "364" "epoch time (2021/09/12 02:17)" | nc "localhost" "2004"
...
echo "perf.$type.$serial.$object.00:00:01.TOTAL_IOPS" "610" "epoch time (2021/09/12 02:16)" | nc "localhost" "2004"
echo "perf.$type.$serial.$object.00:00:01.TOTAL_IOPS" "210" "epoch time (2021/09/12 02:17)" | nc "localhost" "2004"
.. etc..
我不知道從哪種方式開始,我嘗試使用 awk 沒有成功
Trial1: awk -F "," 'BEGIN{FS=","}NR==1{for(i=1;i<=NF;i ) header[i]=$i}{for(i=1;i<=NF;i ) { print header[i] } }' file.csv
Trial2: awk '{time=$2; for(i=3;i<=NF;i ){time=time" "$i}; print time}' file.csv
非常感謝您的幫助。
uj5u.com熱心網友回復:
在普通的 bash 中:
#!/bin/bash
{
IFS=',' read -ra header
header=("${header[@]//\"}")
nf=${#header[@]}
row_nr=0
while IFS=',' read -ra flds; do
datetime[row_nr ]=$(date -d "${flds[1]//\"}" ' %s')
for ((i = 2; i < nf; i)); do
col[i] =" ${flds[i]}"
done
done
} < file
for ((i = 2; i < nf; i)); do
v=(${col[i]})
for ((j = 0; j < row_nr; j)); do
printf 'echo "perf.$type.$serial.$object.%s.TOTAL_IOPS" "%s" "epoch time (%s)" | nc "localhost" "2004"\n' \
"${header[i]}" "${v[j]}" "${datetime[j]}"
done
done
uj5u.com熱心網友回復:
請您嘗試以下操作:
awk -F, '
NR==1 { # process the header line
for (i = 3; i <= NF; i ) {
gsub(/"/, "", $i) # remove double quotes
tt[i-2] = $i # assign time array
}
next
}
{ # process the body
gsub(/"/, "", $0)
dt[NR - 1] = $2 # assign datetime array
for (i = 3; i <= NF; i ) {
key[NR-1, i-2] = $i # assign key values
}
}
END {
for (i = 1; i <= NF - 2; i ) {
for (j = 1; j <= NR - 1; j ) {
printf "echo \"perf.$type.$serial.$object.%s.TOTAL_IOPS\" \"%d\" \"epoch time (%s)\" | nc \"localhost\" \"2004\"\n", tt[i], key[j, i], dt[j]
}
}
}
' file.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372413.html
上一篇:在bash中比較整數
