awk + set variável dentro do awk

0

o seguinte script bash simples imprime o número da linha ( do arquivo - list.txt )

function get_row

{ 

[[ $1 = 1 ]] &&  awk '{print $1}' list.txt
[[ $1 = 2 ]] &&  awk '{print $2}' list.txt

} 


get_row 1
get_row 2

mas eu quero escrevê-lo mais elegante ...

é possível definir "$ 1" como variável como awk '{print $ val}'

então, se eu chamar função como get_row 1, então $ val receberá o valor 1

    
por yael 24.04.2018 / 13:21

2 respostas

2

Você quer algo assim?

function get_column
{ 
    awk -v val=$1 '{print $val}' list.txt
}

Acima está retornando a correspondência de coluna com $1 passando para a função. se você realmente precisar imprimir a correspondência de linha com o número da linha em $1 da função, use em seguida.

function get_row
{ 
    awk -v val=$1 'NR==val{print ; exit}' list.txt
}

Ou deixe o shell avaliar e definir o valor val e imprimi-lo em awk da seguinte forma:

function get_column
{ 
    awk '{print $val}' val=$1 list.txt
}
function get_row
{ 
    awk 'NR==val{print ; exit}' val=$1 list.txt
}

Aqui você está passando val somente com números e se val continha barra invertida caractere de escape você encontrará um problema que awk faz C escapar do processamento da sequência em valores passados via -v val= e uma variável shell com val="\n" mudará para valor com \n por awk .

    
por 24.04.2018 / 13:30
3

Você pode usar:

field=$1 awk '{print $ENVIRON["field"]}'

funciona em todos os sistemas compatíveis com POSIX, e você não precisa se preocupar com a injeção de código ao usar -v val=

Além disso, a função deve ser denominada get_column em vez de get_row .

    
por 24.04.2018 / 13:40

Tags