#bash #csv #awk #hashmap
#удар #csv #awk #хэш-карта
Вопрос:
Я попытался прочитать по вертикали csv-файл, как показано ниже, чтобы вставить его в базу данных graphite/carbon.
"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;ilt;=NF;i ) header[i]=$i}{for(i=1;ilt;=NF;i ) { print header[i] } }' file.csv Trial2: awk '{time=$2; for(i=3;ilt;=NF;i ){time=time" "$i}; print time}' file.csv
Большое спасибо за любую помощь.
Комментарии:
1. Пожалуйста, опубликуйте соответствующий ожидаемый результат. Не публикуйте это в виде комментария, изображения, таблицы или ссылки на стороннюю службу, а используйте текст и включите его в свой исходный вопрос. Спасибо.
Ответ №1:
В простой трепке:
#!/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 lt; nf; i)); do col[i] =" ${flds[i]}" done done } lt; file for ((i = 2; i lt; nf; i)); do v=(${col[i]}) for ((j = 0; j lt; 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
Комментарии:
1. Большое спасибо, это работает. Но как я могу преобразовать дату «»2021/09/12 02:25» в эпоху, подобную дате-d ‘2021/09/12 02:16’ «%s»
2. @Indi59 Я отредактировал ответ, чтобы отразить это требование.
3. я только что видел , это идеально, это работает, большое спасибо, Неджат
Ответ №2:
Не могли бы вы, пожалуйста, попробовать следующее:
awk -F, ' NR==1 { # process the header line for (i = 3; i lt;= 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 lt;= NF; i ) { key[NR-1, i-2] = $i # assign key values } } END { for (i = 1; i lt;= NF - 2; i ) { for (j = 1; j lt;= 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
Комментарии:
1. Большое спасибо, это тоже работа, я не могу проверить ваш ответ как решенный, но код awk тоже может мне помочь !
2. я храню этот код в своей библиотеке, большое спасибо, Тшионо!