2015-08-07 1 views
-1

У меня есть файл ввода p.txt, который я хочу рассчитать и классифицировать, я, похоже, не получаю желаемый результат.Подсчитайте и классифицируйте с помощью awk

входного файла:

A1 G1 C1 F1 
A2 G1 C1 F1 
A3 G1 C1 F2 
A4 G1 C2 F2 
A7 G1 C2 F2 
A8 G1 C2 F3 
A11 G1 C2 F3 
A23 G1 C2 F3 
B4 G1 C2 F3 
AC4 G2 C3 F4 
B6 G2 C4 F4 
BB5 G2 C4 F4 
A25 G2 C5 F4 
B13 G2 C5 F5 
D12 G2 C5 F5 
D2 G2 C5 F5 
B89 G2 C5 F6 
B44 G2 C5 F6 

Желаемый результат:

G1(9) 
F1(2) 
C1=A1,A2 

F2(3) 
C1=A3 
C2=A4,A7 

F3(4) 
C2=A8,A11,A23,B4 


G2(9) 
F4(4) 
C3=AC4 
C4=B6,BB5 
C5=A25 

F5(3) 
C5=B13,D12,D2 

F6(2) 
C5=B89,B44 

Я попытался это:

awk '{ 
    D[$2]++ 
    A[$4]++ 
    B[$4 FS $3] = B[$4 FS $3] ? B[$4 FS $3] "," $1 : $1 
    if(!tmp[$4 FS $3]++)order[++c]=$4 FS $3 
} 

function orderp(subs,mains){ 
    for(j in B){ 
     if(j==subs){ 
      split(j,X) 
      if(X[1]==mains) 
       print X[2]"="B[j] 
     } 
    } 
} 

END{ 
    for(i in D){ 
     print i"("D[i]")" 
     for(i in A){ 
      print i"("A[i]") " 
      for(m=1;m<=c;m++){ orderp(order[m],i) } 
      print "" 
     } 
    } 
} 
' p.txt 

Я не получаю желаемый результат Это белый в я получаю:

G1(9) 
F1(2) 
C1=A1,A2 

F2(3) 
C1=A3 
C2=A4,A7 

F3(4) 
C2=A8,A11,A23,B4 

F4(4) 
C3=AC4 
C4=B6,BB5 
C5=A25 

F5(3) 
C5=B13,D12,D2 

F6(2) 
C5=B89,B44 

G2(9) 
F1(2) 
C1=A1,A2 

F2(3) 
C1=A3 
C2=A4,A7 

F3(4) 
C2=A8,A11,A23,B4 

F4(4) 
C3=AC4 
C4=B6,BB5 
C5=A25 

F5(3) 
C5=B13,D12,D2 

F6(2) 
C5=B89,B44 
+0

'A1 G1 C1 F1' ' A2 G1 C1 F1' 'A3 G1 C1 F2' ' A4 G1 C2 F2' 'A7 G1 C2 F2' ' A8 G1 С2 F3' 'А11 G1 С2 F3' ' А23 G1 С2 F3' 'B4 G1 С2 F3' ' АС4 G2 С3 F4' 'В6 G2 С4 F4' ' BB5 G2 С4 F4' 'А25 G2 C5 F4' 'B13 G2 C5 F5' ' D12 G2 C5 F5' 'D2 G2 C5 F5' ' B89 G2 C5 F6' 'B44 G2 C5 F6' – user3437245

+1

Это относительно сложно для« почему моя программа не работает? » type вопрос. Я подозреваю, что вы найдете больше людей, желающих помочь, если вы более конкретно продемонстрируете, что не удается в выходе, который вы получаете сейчас, как вы пытались отладить его и где вы застряли. – jas

+0

Итак, ваш фактический результат довольно близкий, только вы не ограничиваете значения «F», которые не соответствуют текущему значению «G». Я имею в виду, что если вы только напечатали F1, F2 и F3 после G1 и только F4, F5 и F6 после G2, это было бы идеально. Это где вы застряли? Есть ли где-то в коде, который вы уже пытаетесь сделать? – jas

ответ

0

Вам нужно создать G конкретный вспомогательный массив. Вот исправление кода:

awk '{ 
    D[$2]++ 
    A[$2 FS $4]++ 
    B[$2 FS $4 FS $3] = B[$2 FS $4 FS $3] ? B[$2 FS $4 FS $3] "," $1 : $1 
    if(!tmp[$2 FS $4 FS $3]++)order[++c]=$2 FS $4 FS $3 
} 

function orderp(subs,mains){ 
    for(j in B){ 
     if(j==subs){ 
      split(j,X) 
      if(X[1] FS X[2] == mains) 
       print X[3]"="B[j] 
     } 
    } 
} 

END{ 
    for(k in D){ 
     print k"("D[k]")" 
     for(i in A){ 
      split(i,X) 
      if(k == X[1]){ 
      print X[2]"("A[i]") " 
      for(m=1;m<=c;m++){ orderp(order[m],i) } 
      print "" 
      } 
     } 
    } 
} 
' p.txt 
Смежные вопросы