Exportação decimal awk Unix em pipe

1

Estou com dificuldades para adaptar um script, que percorre um grande número de arquivos individuais (subj_id) e imprime o valor de $ 4 em uma linha especificada.

O arquivo de texto contém linhas

# Measure Brain, ICV, Brain Volume, 1118718.609121, mm^3

Meu script contém esta linha para exportar o número 1118718:

printf "%g," 'cat ${subj_id}/stats/aseg.stats | grep ICV | awk -F, '{print $4}'' > BrainVol.csv

Meus valores são A) 666666.012345 ou B) 7777777.012345 , portanto, o script é executado corretamente com A) e exporta 666666 , mas para o caso B) , ele exporta 7777780 . Eu entendo que eu preciso usar printf para especificar o número de decimais para saída mas '{printf "%.2f\n",$4}' não funciona.

Desculpe, isso é muito básico, mas qual é a ordem correta neste pipe para incluir um especificador decimal (se esse for o problema).

É um script bash e estou executando o Mac OS X 10.7.5

Qualquer ajuda seria muito apreciada.

    
por julia 23.12.2015 / 18:18

1 resposta

3

O seguinte funciona para mim:

awk -F, '/ICV/ {printf "%.2f\n", $4}' ${subj_id}/stats/aseg.stats

onde, se eu usar a seguinte fonte:

# Measure Brain, ICV, Brain Volume, 1118718.609121, mm^3
# Measure Brain, ICV, Brain Volume, 7777777.012345, mm^3
# Measure Brain, ICV, Brain Volume, 666666.012345, mm^3

Eu recebo a seguinte saída:

1118718.61
7777777.01
666666.01

Como observou @glennjackman, podemos tornar a correspondência mais específica, verificando se o campo esperado é a sequência exata que queremos, em vez de corresponder a um padrão em qualquer lugar da linha, fazendo

awk -F, '$2 == " ICV" {printf "%.2f\n", $4}' ${subj_id}/stats/aseg.stats

ou se quisermos ser flexíveis sobre espaços, poderíamos combinar o padrão apenas com aquele campo

awk -F, '$2 == /^[[:space:]]*ICV[[:space:]]*$/ {printf "%.2f\n", $4}' ${subj_id}/stats/aseg.stats
    
por 23.12.2015 / 18:41