bash считывает из CSV несколько столбцов с хэш-ключом

#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. я храню этот код в своей библиотеке, большое спасибо, Тшионо!