Uma solução com awk
:
awk 'FNR==NR{c[$4]++;next;} c[$4]==3' file.dat file.dat
Saída:
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
Explicação:
-
FNR==NR
: este teste é verdadeiro quando o número de registros é igual ao número de registros no arquivo. Isso só é válido para o primeiro arquivo, pois o segundo arquivoNR
será igual ao número de linhas do arquivo1 + FNR. -
c[$4]++
: Incrementa um índice de elemento de matriz em$4
. Eu uso isso como um contador. -
next
: pula para o próximo registro sem fazer mais nada. -
c[$4]==3
: Isso só acontece nos registros do segundo arquivo. Se esse teste for bem sucedido, a linha será impressa, pois a impressão é a ação padrão emawk
.
Este código tem a desvantagem de ler o arquivo duas vezes, mas na minha opinião é uma maneira limpa e fácil de entender para fazer este trabalho.