Analisa o cabeçalho em um arquivo e, com base no cabeçalho, substitui um valor no arquivo

0

Eu tenho o seguinte arquivo

Field1|Field2|Field3|Field4|Field5
a|b|c|d|e
1|2|3|4|5
z|y|x|w|v

Eu tenho um script que aceita duas entradas

script.sh Field3 T

O script.sh usaria o argumento 'Field3' e, baseado nesse número de coluna, deveria substituir o conteúdo por 'T'.

[editar]

Eu tentei a seguinte sugestão do @Costas e me deparei com um problema. Meu arquivo é assim:

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2~Y~N~~0

Se eu executar o seguinte script

cat <filename> | awk -F'~' -v p='MODULE_ColumnD' -v r='99' 'NR==1{for (i=1;i<=NF;i++) if($i==p)f=i;print;next}$f=r'

Substitui o valor, mas o delimitador está faltando ou foi substituído por espaço na saída como tal:

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2 Y N 99 0

Como obtenho o delimitador nos registros?

    
por rahul 05.03.2015 / 18:11

1 resposta

3
awk -F'|' -v p='Field3' -v r='T' '
    NR==1{
        for (i=1;i<=NF;i++)
            if ($i==p)
               f=i
        print
        next}
    $f=r
'

Se você quiser formatá-lo para usar como script.awk , salve como:

#!/usr/bin/awk -f
BEGIN{
    OFS=FS="|"}
NR==1{
    for (i=1;i<=NF;i++)
        if ($i==p)
            f=i
    print
    next}
$f=r

e torne seu executável por chmod +x script.awk e use:

./script.awk p=Field4 r=T input.file
    
por 05.03.2015 / 18:29