Alterar uma palavra com base no conteúdo do arquivo

0

Eu tenho um arquivo que contém data e hora e data na segunda coluna. Se a linha contiver uma das palavras, então deverá ser substituída como abaixo.

File:
a smallint
b timestamp
c date
d varchar

O/P:
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar

Se eu executar este comando abaixo como um único awk, então eu estou recebendo a saída, mas se eu usar outra condição, então eu estou recebendo erro.

awk '{if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD)" }' test.out 

Erro:

awk: {if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD HH:NN:SS.sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD)" }
awk: ^ syntax error
    
por Josh 23.10.2018 / 03:49

2 respostas

2

Eu escreveria:

awk -v q="'" '
    $2 == "timestamp" { $0 = sprintf("dateformat(%s, "q"YYYY-MM-DD HH:NN:SS.sss"q")", $1) }
    $2 == "date"      { $0 = sprintf("dateformat(%s, "q"YYYY-MM-DD"q")", $1) }
                      { print }
' file
    
por 23.10.2018 / 04:49
1

Deixe-me envolver as linhas no seu comando primeiro:

awk '
    {
        if ($2=="timestamp") {
            $3="dataformat("; 
        };
        print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
        else ($2=="date") {
            $3="dataformat("; 
        };
        print $3 $1 ",'\''YYYY-MM-DD)"
    }
' test.out 

Portanto, dois problemas, um é que a cláusula else não está alinhada com a cláusula if (há um comando print fora dela) e a segunda é que a cláusula else não é necessária uma condição, você deseja usar else if .

Então talvez isso seja o que se pretendia?

awk '
    {
        if ($2=="timestamp") {
            $3="dataformat("
            print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
        } else if ($2=="date") {
            $3="dataformat("
            print $3 $1 ",'\''YYYY-MM-DD)"
        }
    }
' test.out 

Também não tenho certeza do que você quer fazer sobre as outras linhas que não correspondem ... Você pode adicionar um else ao final que faz um simples print (o padrão é imprimir a linha não modificada) ou talvez um print de campos específicos.

Por favor, note que a formatação é útil para ver como seus blocos se aninham! Esta é uma sintaxe perfeitamente válida, o shell usa várias strings com aspas simples e o awk também ficará muito feliz com elas. Eu recomendo que você use essa formatação mais legível de seus scripts awk.

    
por 23.10.2018 / 04:49