2016-02-22 1 views
1

Пример файла:Баш счетчик оболочки AWK вероятность и вывод

1 book book 
     1 book is 
     1 book This 
     1 is book 
     2 is is 
     1 is pen 
     2 is This 

Я хочу напечатать $1/(sum of $1 with the same $2),$2,$3

результат должен быть:

1/3 book book 
1/3 book is 
1/3 book This 
1/6 is book 
2/6 is is.....etc 

Вот awk сценарий и я хочу найти как переписать его для достижения моей цели

{ 
count[$2]+=$1 
} 
END{for(elem in count) print $1/count[elem],count[elem],$3} 
+0

питона будет лучше подходит для этой задачи, вам нужно сканировать файл дважды - один раз для вычисления отсчетов и второй раз, чтобы распечатать статистику, и не думают, что старый AWK может сделать это – csharpfolk

+0

@csharpfolk Он может, посмотри на мой ответ. – 123

+1

@ 123 вы передавали файл для обработки дважды, славное решение - вроде – csharpfolk

ответ

4

Использование awk.

Пронумеруйте файл дважды.
Для первого приращения файла значение массива с ключом $2 на значение в $ 1, а затем пропустить обработку.
Распечатайте строку со значениями из массива после $ 1.

awk 'NR==FNR{a[$2]+=$1;next}{print $1"/"a[$2],$2,$3}' file file 


1/3 book book 
1/3 book is 
1/3 book This 
1/6 is book 
2/6 is is 
1/6 is pen 
2/6 is This 
+0

отличный ответ, как я могу написать его, если скрипты? BEGIN { NR == ПЗФ } { количество [$ 2] + = $ 1, следующий } END {печать $ 1 "/" подсчитывать [$ 2], $ 2, $ 3} это произвести неправильный ответ после ввода AWK -f сценарий file file –

+0

Буквально вставьте ту же самую команду в файл. Почему вы добавили BEGIN? – 123