AWK запись CSV-файла с несколькими столбцами

#bash #csv #awk

#bash #csv #awk

Вопрос:

в настоящее время я запускаю различные тесты и записываю необходимые результаты в файл csv. однако это отлично работало, когда нужно было проверить один результат, прямо сейчас я получаю много результатов, и я хотел бы записать их в файл csv, но иметь 4 столбца, а затем перейти к следующему файлу

 #!/bin/bash
LOOPS="$1"
FILE="test.csv"
for ((COUNTER=1; COUNTER <= LOOPS; COUNTER  ))
do
    echo "RUN $COUNTER"
    cryptsetup benchmark 2>amp;1 | grep "aes" | awk '{print $5}' >> $FILE
done
  

исходный вывод выглядит следующим образом

 #  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   128b   557.1 MiB/s  1832.1 MiB/s
 serpent-cbc   128b    65.0 MiB/s    75.1 MiB/s
 twofish-cbc   128b   122.0 MiB/s   155.0 MiB/s
     aes-cbc   256b   412.9 MiB/s  1422.5 MiB/s
  

и было бы намного проще, если бы выходные данные были разделены на четыре столбца, а не все в одном

вывод должен выглядеть следующим образом

 1832.1 75.1 155.0 1422.5
1832.1 75.1 155.0 1422.5
  

Комментарии:

1. я думаю, он уже в четырех столбцах. Вы хотели убрать пробел между числом и MiB / s?

2. о, извините, код исправлен, он должен выглядеть в 5-м столбце, выводится только один столбец

3. в качестве примера, в результатах отображается больше, только повторяется, поэтому ясно, как я хочу, чтобы это выглядело

4. вам нужен только пятый столбец в одной строке?

5. я хочу, чтобы первые 4 записи в 5-м столбце были первой строкой. затем следующие 4 записи должны быть во второй строке … и так далее

Ответ №1:

Awk должен работать.

Начинается со второй строки для удаления заголовков. Удаляет начальные пробелы и устанавливает разделитель полей на 3 пробела, затем печатает каждое поле, разделенное запятыми 🙂

 awk -F "  " 'NR>1{gsub(/^[ t] |[ t] $/,""); print $1","$2","$3","$4}' test
  

Ответ №2:

Следующая команда выведет 5-й столбец каждой строки в одной строке, разделенной запятой.

 awk '(NR>1){printf ",";} {printf "%s",$5} END {print ""}'
  

Комментарии:

1. awk 'NR>1{printf ",%s",$5} END {print ""}' test

2. @Jidder, вывод вашего комментария будет начинаться с «,».

3. Ваш начинается с запятой, просто вы напечатали строку из первой строки перед ней

4. Я ожидал cryptsetup benchmark 2>amp;1 | grep "aes" | awk ...