2015-03-05 6 views
-1

Я боюсь сбрасывать некоторые awk-переменные. Я имею несколько строк вида: один два три ... десятьПовторная инициализация awk-переменных

с различными проявлениями каждого слова в каждой строке. Я пытаюсь подсчитать количество раз, когда каждое слово составляет одну строку, отдельно от счетчиков с других строк.

это то, что я до сих пор:

{ for(i=length(Num); i>0; i--) 

    if(Num[i] == "one") 
    {     
      oneCount++ 
    } 
    else if(Num[i] == "two") 
    {  
      twoCount++ 
    } 
    else if(Num[i] == "three") 
    { 
      threeCount++ 
    } 
... 
} 

при печати из значений отсчета, граф не переинициализировать с каждой новой строки. Как это исправить?

любая помощь очень ценится

+2

Что такое 'Num'? Вы сбросите все значения в начале каждого цикла, чтобы очистить их. Но это похоже на неправильный подход. Что вы планируете делать с этими подсчетами для каждой строки? –

+0

Пожалуйста, разместите все соответствующие коды. – Palec

+0

Num - массив, созданный с использованием функции split, потому что изначально строки имели вид: один, два, два, пять, пять, пять , поэтому предыдущий код: {split ($ 1, Num, "; ")} –

ответ

0

Попробуйте инициализировать массив в BEGIN, порцией однако многих переменных вы хотели бы рассчитывать. Вы можете запустить цикл в части, чтобы очистить массив в начале каждой новой строки.

В качестве альтернативы вы можете просто сбросить значение каждой переменной до 0 или null в той части программы, которая выполняет каждую строку, но я предполагаю, что у вас много переменных.

+0

как это будет работать? Я попробовал реселлинг до 0, но он продолжал давать мне ошибку –

+0

Что вы попробовали сбросить до нуля? Какова была ваша точная строка кода? Какое точное сообщение об ошибке вы получили? –

+0

как бы инициализировать массив в BEGIN? как BEGIN {oneCount, twoCount ...}? Я попытался добавить oneCount = 0 перед каждым разделом оператора if, но он дал мне «Синтаксическую ошибку» –

1

Вы, кажется, очень смущены. Для того, чтобы получить количество каждого поля в ; -разделенной линии будет:

awk -F';' '{ 
    split("",cnt) # or "delete cnt" if using GNU awk. 
    for (i=1;i<=NF;i++) { 
     cnt[$i]++ 
    } 
    for (word in cnt) { 
     print word, cnt[word] 
    } 
}' file 

Теперь есть все, что нужно это делать?

+0

это не сработало для меня ... мне была предоставлена ​​ошибка, которая была удалена, была незаконна –

+0

, тогда вы не используете GNU awk, поэтому используйте 'split (" ", cnt)' вместо этого. Я предположил, что вы используете GNU awk, так как ваш скрипт использует 'length (array)', который является gawk-ism. –

+0

так разделен ($ 1, Num, ";", cnt)? –

Смежные вопросы