Home > Net >  bash read from CSV multiple columns whith hash key
bash read from CSV multiple columns whith hash key

Time:12-01

I tried to read verticaly a csv file as follow to insert in graphite/carbon 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
...

I wish to generate commands for each column header 00:00:XX taking into account the hour in column $ 2 and of the value during this time

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..

I dont know by which way to start, i tried with awk without success

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

Many thanks for any help.

CodePudding user response:

In plain bash:

#!/bin/bash

{
    IFS=',' read -ra header
    header=("${header[@]//\"}")
    nf=${#header[@]}
    row_nr=0
    while IFS=',' read -ra flds; do
        datetime[row_nr  ]=${flds[1]}
        for ((i = 2; i < nf;   i)); do
            col[i] =" ${flds[i]}"
        done
    done
} < file

datetime=("${datetime[@]//\"}")

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

CodePudding user response:

Would you please try the following:

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
  • Related