Encontre o número FN com awk

2

Eu tenho um documento, e este documento tem várias colunas, como esta:

,Flag2,,Flag4,Flag5,,,,,Flag10,Flag11,Flag12,Flag13

Se eu usar o awk para saber o número total de campos, saber que o caractere separador é , o resultado é: 13

Agora, quero obter o número do campo para Flag10, o resultado deve ser: 10

Como posso fazer isso com o awk?

    
por user3658319 02.03.2015 / 17:13

3 respostas

3

Você poderia fazer como abaixo,

awk -F, '{for(i=1;i<=NF;i++)if($i=="Flag10")print i}' file

Exemplo:

$ echo ',Flag2,,Flag4,Flag5,,,,,Flag10,Flag11,Flag12,Flag13' | awk -F, '{for(i=1;i<=NF;i++)if($i=="Flag10")print i}'
10
    
por 02.03.2015 / 17:16
3

Para usar awk incorporado:

awk -F, -v field="Flag10" '{sub(field",.*",field);print split($0,any)}' doc.file

O script removerá tudo após a primeira ocorrência do valor de field (nesse caso, Flag10 ) e, em seguida, imprimirá o resultado da divisão da linha em vírgulas. Como excluímos tudo depois de Flag10 , isso resulta no número de campos restantes, que é o número do campo do padrão de pesquisa.

    
por 02.03.2015 / 17:47
2

Eu normalmente crio um array associativo, mapeando os nomes dos cabeçalhos para os números das colunas

awk -F, -v head="Flag10" '
    FNR == 1 {for (i=1; i<=NF; i++) col[$i] = i}
    {print $col[head]}
' << END
,Flag2,,Flag4,Flag5,,,,,Flag10,Flag11,Flag12,Flag13
10,20,30,40,50,60,70,80,90,100,110,120,130
END
Flag10
100
    
por 02.03.2015 / 17:21