awk
com ajuda da substituição de processo ( <()
), sort
e uniq
:
awk 'NR==FNR{a[$0]; next} {for (i in a) if ($1==i) {print}}' \
<(awk '{print $1}' file.txt | sort| uniq -c | awk '$1 >= 5 {print $2}') file.txt
-
awk '{print $1}' file.txt | sort| uniq -c | awk '$1 >= 5 {print $2}'
obtém os primeiros campos em que o conteúdo ocorre maior ou igual a 5 vezes. A substituição do comando,<()
, substitui o STDOUT por um descritor de arquivo, que é passado como o primeiro argumento para o principal workerawk
process, com o arquivo de entrada original como segundo -
NR==FNR{a[$0]; next}
cria a matriza
com os elementos do primeiro arquivo (NR==FNR
) como as chaves -
{for (i in a) if ($1==i) {print}}'
imprime as linhas defile.txt
que têm as chaves da matriza
como o primeiro campo
A ressalva óbvia é que essa abordagem está lendo o arquivo duas vezes, o que pode não ser a solução ideal para um arquivo de entrada grande ( na definição usual ), em que alta velocidade e / ou baixo recurso o uso é esperado.
Exemplo:
% cat file.txt
realism:::N 1.33 depth:::N 3.11 341
realism:::N 1.33 problem:::N 2.68 335
realism:::N 1.33 now:::ADV 1.48 335
realism:::N 1.33 life:::N 2.69 334
renowned:::ADJ 1.41 be:::V 1.85 15760
renowned:::ADJ 1.41 internationally:::ADV 2.23 9134
renowned:::ADJ 1.41 world:::N 4.36 6736
renowned:::ADJ 1.41 most:::ADV 2.38 5482
reverent:::ADJ 1.5 use:::V 2.78 25
reverent:::ADJ 1.5 sacred:::ADJ 1.77 25
reverent:::ADJ 1.5 music:::N 4.31 25
reverent:::ADJ 1.5 devout:::ADJ 2.46 25
reverent:::ADJ 1.5 devotion:::N 2.36 25
% awk 'NR==FNR{a[$0]; next} {for (i in a) if ($1==i) {print}}' <(awk '{print $1}' file.txt | sort| uniq -c | awk '$1 >= 5 {print $2}') file.txt
reverent:::ADJ 1.5 use:::V 2.78 25
reverent:::ADJ 1.5 sacred:::ADJ 1.77 25
reverent:::ADJ 1.5 music:::N 4.31 25
reverent:::ADJ 1.5 devout:::ADJ 2.46 25
reverent:::ADJ 1.5 devotion:::N 2.36 25