Как напечатать определенный столбец в строке, используя Unix? - PullRequest
0 голосов
/ 11 января 2012

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

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,

Сохранить серию как общее значение печати series.i.e. первый столбец относительно результирующего code.i.e третий (целочисленный) или четвертый (строковый) столбец входного файла.

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

1 Ответ

1 голос
/ 11 января 2012

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

#!/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

...