Разбор CSV-файла с помощью сценариев оболочки

Я пытался написать скрипт, который будет анализировать файл CSV и выдавать результат в указанном формате.

Входной файл имеет следующий формат.

collectionBeginTime,ID,MU,hostname,Granularity,SampleInterval,suspectFlag,memCpuUsage,memUsedMemory,memMemoryCapacity,memRequestNum,memOnlineUserNum,memUsedLogDisk,memLogDiskCapacity,freeCPUUsage,freeMemory,freeLogDisk
2015-11-27 17:30:00-0500,NE=2106384,hwMEMPerformanceCollect,PG_172.16.169.70,900,900,0,24,7130,36153,0,1554,23026,157239,76,29023,134213
2015-11-27 17:30:00-0500,NE=2106386,hwMEMPerformanceCollect,PG_172.16.169.68,900,900,0,4,7481,36153,0,1594,22778,157239,96,28672,134461

Ожидается, что выходные данные будут в формате (показаны только несколько выходных строк для первой строки ввода):

collectionBeginTime   ,     hostname     ,     Parameters
2015-11-27 17:30:00-0500, PG_172.16.169.70, SampleInterval:900
2015-11-27 17:30:00-0500, PG_172.16.169.70, suspectFlag:0 

Мне нужно напечатать столбцы 1 и 4 для каждой строки после первой, за которыми следует имя столбца (из строки 1 файла), : и значение столбца для столбцов 6..NF (полностью игнорируя столбцы 2, 3, 5) . Одна входная строка порождает множество выходных строк.

Сценарий, который я написал:

#!/bin/bash

FILENAME=$1

awk -F',' 'BEGIN{OFS=",";}  { if ( NR!=1 )print $1,$4,$6,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17}' < $FILENAME >> tmp.txt

echo "completed"

Скрипт запущен, но показывает все параметры в одной строке без названия. Как это исправить?


person Anirban Roy    schedule 21.06.2016    source источник
comment
Вы фиксируете поля в строке 1 для повторного использования (for (i = 4; i <= NF; i++) name[i] = $i;). В других строках вы перебираете поля 4..NF, печатая соответствующие данные, возможно, с printf.   -  person Jonathan Leffler    schedule 21.06.2016
comment
Откуда берутся эти параметры? Они отсутствуют в вашем входном образце   -  person Aaron    schedule 21.06.2016
comment
В выходном столбце № 2, 3, 5 и 7 должны быть опущены, а затем 6 и далее будут объединены с именем параметра, например (SampleInterval:900). Не могли бы вы написать оператор awk, я полагаю, полностью, чтобы он мог быть более ясным   -  person Anirban Roy    schedule 21.06.2016
comment
@Aaron: Они там: столбцы 6..NF содержат значения, а записи в строке 1 (поля 6..NF) содержат имена параметров. Не очевидно, соглашусь, но информация есть.   -  person Jonathan Leffler    schedule 21.06.2016
comment
неважно, тогда у меня был довольно однострочный вариант с cut + column, но он не подходит для этого варианта использования.   -  person Aaron    schedule 21.06.2016
comment
@AnirbanRoy: вам нужно объяснить, как столбец 7 может быть опущен, когда вы показываете его в своем выводе.   -  person Jonathan Leffler    schedule 21.06.2016
comment
извините, это ошибка ... столбец 7 не должен быть пропущен. Я очень извиняюсь за дезинформацию   -  person Anirban Roy    schedule 21.06.2016


Ответы (1)


Вы захватываете поля в строке 1 для повторного использования. В других строках вы перебираете поля 6..NF, печатая соответствующие данные:

awk -F',' 'NR == 1 { for (i = 6; i <= NF; i++) name[i] = $i
                     printf "%s, %s, %s\n", $1, $4, "Parameters"; next }
           { for (i = 6; i <= NF; i++) printf "%s, %s, %s:%s\n", $1, $4, name[i], $i; }'

Непроверенный код.

person Jonathan Leffler    schedule 21.06.2016
comment
Он работает нормально, как и ожидалось, после добавления имени файла после команды awk ... Спасибо. - person Anirban Roy; 21.06.2016