Array com dois arquivos de entrada awk

0

Eu tenho dois arquivos, um com NF=7 e o outro com NF=47

Eu preciso verificar o número de ocorrências de $2 no arquivo com NF=7 . Se a contagem for <=2 , preciso criar uma matriz do mesmo arquivo contendo arr1[$1]=$1

Para esta ação, usei o seguinte código:

awk -F"," '{if(NF==7){arr[$2]++}}END{for(i in a){if(arr[i]<=2){print $0}}}'

Para a ação do segundo arquivo, preciso corresponder $1 do arr[$1]=$1 obtido do primeiro arquivo com $1 do segundo arquivo.

Por favor, veja o exemplo abaixo:

Arquivo1:

1,111,,,,,,
2,111,,,,,,
3,100,,,,,,
4,111,,,,,,

Arquivo2:

1,799,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,899,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
3,999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Saída:

3,999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    
por Eng7 10.08.2015 / 15:46

1 resposta

2

Você pode comparar NR com FNR para distinguir entre processar o primeiro ou os arquivos subseqüentes. Isso ocorre porque FNR é redefinido por arquivo, enquanto NR é a contagem em execução. Portanto, somente durante o processamento do primeiro arquivo a condição NR==FNR será satisfeita.

Para processar o arquivo "mais curto", que deve ser o primeiro ...

awk -F, 'NR==FNR{mapper[$1]=$2;counter[$2]++}...'

Em seguida, processe o arquivo "mais longo" para que seja impresso quando sua condição satisfizer ...

awk -F, 'NR!=FNR&&counter[mapper[$1]]<=2'

Colocando os dois juntos:

awk -F, 'NR==FNR{mapper[$1]=$2;counter[$2]++}NR!=FNR&&counter[mapper[$1]]<=2'

Por padrão, awk imprime a linha inteira quando os critérios de seleção correspondem, então basta especificar NR!=FNR&&counter[mapper[$1]]<=2 .

    
por 12.08.2015 / 09:55