Não sei exatamente o que você deseja fazer porque não mostra a entrada real, apenas a saída desejada e vários bits de código usados em vários estágios. No entanto, acho que o seguinte fará o que você quer (certifique-se de definir -F:
na linha de comando. Se não, tentei descrever cada parte para dar uma idéia de como modificá-la.
!/^#/ { # do the following on all rows that don't begin
# with '#'
a[$1]++ # store column 1 as the key in an array and
# increment the value for each occurrence
}
END { # do the following after reading the entire file
PROCINFO["sorted_in"] = "@ind_num_desc"; # set array traversal as numeric index descending
# (requires gawk >= 4.0, otherwise, additional code
# will be needed)
for (i in a) { # loop through the array setting i as the index of
# the current entry
print a[i], i; # print the value (row count) and the index (the
# row)
}
}
Eu não acho que você precise passar mais uma variável, porque parece que foi usado apenas para identificar quantas linhas de comentário iniciais pular, mas se você quiser fazer isso, você quase o teve no seu exemplo, mas cada vez que você invoca gawk
, é uma instância nova. Você passou a variável para a instância antes da que a usou. Então, no seu exemplo acima, você precisaria mudar para:
gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog \
| sort | uniq -c | sort -r \
| gawk '/#/{n++}; END {print n+0}' \
| gawk -v MyID="$id" "NR> MyID "
Mas tudo isso pode ser combinado. As duas últimas linhas apenas contam as linhas com #
e, eu acho, tentam passar esse valor para outra instância, mas você acabou de imprimi-lo para STDOUT, então não tenho certeza de como isso funcionaria. Então apenas modifique a primeira linha para que o awk pule essas linhas:
gawk -F: '!/^#/ { print $1 }' /cygdrive/c/counting/ourlog \
| sort | uniq -c | sort -r
Se é isso que você quer, e você quer evitar todos os canais, o código acima funcionará.