Awk Итерация по нескольким массивам в цикле for - PullRequest
1 голос
/ 01 июля 2011

Я создал программу awk, которая просматривает столбцы файла и подсчитывает каждое отдельное слово, а затем выводит итоговые значения в отдельные файлы

awk -F"$delim" {Field_Arr1[$1]++; Field_Arr2[$2]++; Field_Arr3[$3]++; Field_Arr4[$4]++}; 
END{\
    #  output fields
    out_field1="top_field1"
    out_field2="top_field2"
    out_field3="top_field3"
    out_field4="top_field4"

    for( i=1; i <= NF; i++)
    {
        for (element in Field_Arr$i) 
        {
            print element"\t"Field_Arr$i[element] >>out_field$i;
        }
    }
}' inputfile

но я не знаю подходящий синтаксис, так что цикл for будет перебирать Field_Arr1, Field_Arr2, Field_Arr3, Field_Arr4?

Я пытался использовать: i, $ i, $ {i}, {i}, "$ i" и "i".

Я пытаюсь использовать неправильный подход или есть способ изменить Field_Arr $ i на Field_Arr1..4?

Спасибо за совет.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

awk переменные не работают таким образом; вам придется делать их индивидуально по имени или использовать поддельные многомерные массивы и анализировать компоненты, что-то вроде:

{Field_Arr[1, $1]++; Field_Arr[2, $2]++; Field_Arr[3, $3]++; Field_Arr[4, $4]++}
END {
  for (elt in Field_Arr) {
    split(elt, ec, SUBSEP)
    print ec[2] "\t" Field_Arr[elt] >> ("top_field" ec[1])
  }
}
1 голос
/ 01 июля 2011

Чтобы посчитать частоты для каждого столбца (3 в моем примере), попробуйте это

# Print list of word frequencies
function p_array(t,a) {
    print t
    for (i in a) {
        print i, a[i]
    }
}

{
    c1[$1]++
    c2[$1]++
    c3[$1]++
}
END {
    p_array("1st col",c1)
    p_array("2nd col",c2)
    p_array("3rd col",c3)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...