$ gawk '{print > "file" ++a[$1] ".txt"}' input
# And on OSX awk, and also gawk:
$ awk '{print > ("file" ++a[$1] ".txt")}' input
$ head file*txt
==> file1.txt <==
1 Cat
2 Boy
3 Tree
==> file2.txt <==
1 Dog
2 Girl
3 Leaf
==> file3.txt <==
1 Frog
3 Branch
==> file4.txt <==
3 Trunk
edit : Объяснение.
Текущая строка печатается в (>
) fileX.txt
. Каждый раз, когда обнаруживается первое поле, массив a [$ 1]
увеличивается на 1 перед вычислением.Это используется для определения имени файла.
редактировать 2 :
У меня нет возможности проверить с помощью OSX awk, но я полагаю, что если вы наполовину серьезно относитесь к использованию awk, вам следует установить gawk
или mawk
. Однако вы можете попробовать следующее:
$ awk '{a[$1]++; f = "file" a[$1] ".txt"; print > f}' input
Это то же самое, но все действие разделено на отдельные шаги. Это поможет OSX awk понять правильный порядок оценки частей.
awk 'NF>=8 && NR>1 { entries++; sum+=$8 } END { print "Total for column 8:", sum, "over", entries, "records with this value present." }' inputfile