Как напечатать определенный столбец в строке с помощью unix?

У меня есть один входной файл, который приведен ниже.

Values,series,setupresultcode,nameofresultcode,resultcode
2,9184200,,serviceSetupResultempty,2001
11,9184200,0,successfulReleasedByService,2001
194,9184200,1,successfulDisconnectedByCallingParty,2001
101,9184200,2,successfulDisconnectByCalledParty,2001
2,9184201,0,successfulReleasedByService,2001
78,9184201,1,successfulDisconnectedByCallingParty,2001
32,9184201,2,successfulDisconnectByCalledParty,2001
4,9184202,0,successfulReleasedByService,2001
63,9184202,1,successfulDisconnectedByCallingParty,2001
37,9184202,2,successfulDisconnectByCalledParty,2001

Я хочу вывести, как указано ниже:

Series,successfulReleasedByService,successfulDisconnectedByCallingParty,successfulDisconnectByCalledParty,serviceSetupResultempty
9184200,11,194,101,2
9184202,4,63,37,

Сохраняйте серию как общее значение печати серии, т.е. первый столбец по отношению к коду результата, т.е. третий (целое число) или четвертый (строка) столбец во входном файле.

Например: второй столбец данных имеет n серий; возьмем 9184200. Эта серия имеет 4 setupresultcode (пусто,0,1,2). Название каждого кода результата указано в 4-м столбце. Я хочу напечатать, если код результата равен 0; т. е. successReleasedByService, затем напечатайте значение 11 по отношению к серии 9184200.


person gyrous    schedule 11.01.2012    source источник
comment
извините, я не понимаю логики преобразования. Не могли бы вы расширить и объяснить более подробно?   -  person Benoit    schedule 11.01.2012
comment
Я думаю, что @gyrous хочет превратить значения unique(setupresultcode) в заголовки столбцов, unique(series) в строки и перечислить в каждой паре строк-столбцов соответствующие Vales.   -  person mathematical.coffee    schedule 11.01.2012
comment
извините, даже я запутался. :(. позвольте мне попытаться объяснить, например: второй столбец, содержащий n серий, принимает 9184200. эта серия имеет 4 setupresultcode (пусто, 0,1,2). имя каждого кода результата указано в 4-м столбце. я хочу выведите, если код результата равен 0.i.esuccessfulReleasedByService, затем выведите значение 11 относительно серии 9184200.   -  person gyrous    schedule 11.01.2012
comment
(1) Почему нет строки 9184201? (2) откуда взялись 10,200?   -  person kev    schedule 11.01.2012
comment
Пожалуйста, отредактируйте объяснение в вопросе, а не добавляйте комментарии.   -  person Jonathan Leffler    schedule 11.01.2012
comment
Должна ли трансформация иметь дело с возможно отсутствующими кодами? Представлены ли коды по порядку в данных? Всегда ли коды серии являются смежными?   -  person Jonathan Leffler    schedule 11.01.2012
comment
Преобразование не касается отсутствующего кода. я просто пытаюсь распечатать вывод, как я уже упоминал ранее, чтобы упростить его. поэтому я могу получить серию по кодам результатов. просто я могу сказать, что упорядочиваю в том порядке, в котором хочу   -  person gyrous    schedule 12.01.2012


Ответы (1)


Что-то вроде этого может работать, хотя я его не тестировал, расценивайте это как какой-то псевдокод.

#!/bin/awk -f
BEGIN
{
  number_of_series=0;
}
{
  #This part will be executed for every line
  if ($3 =="0" || $3 == "1" || $3 == "2")
  {
    for (i=1; i<=number_of_series; i++)
    {
      #If the series has already been added
      if(seriesarray[i] == $2)
      {
        #Concat the results
        seriesarray[$2]=seriesarray[$2]","$1;
      }
      #If it's a new series
      else
      {
        number_of_series++;
        seriesarray[$2]=$1;
      }
    }
  }
}
END
{
  #Iterate over the series and print the series id and the concatenated results
  for (series in seriesarray)
  {
    print series, seriesarray[series];
  }
}

Это даст что-то вроде

9184200,11,194,101

9184201,2,78,32

9184202,4,63,37

person Kristofer    schedule 11.01.2012
comment
Привет, Кристофер, спасибо за твой пост. Можете ли вы сказать мне, как дать ввод? Я получаю ошибку, как это. - person gyrous; 12.01.2012
comment
./test.sh ‹ test1 /bin/nawk: синтаксическая ошибка в исходной строке 3, контекст BEGIN ››› ‹‹‹ /bin/nawk: спасение в исходной строке 3 - person gyrous; 12.01.2012