Passando o padrão de impressão como uma variável para awk

3

Estou tentando usar awk para imprimir variáveis de várias colunas em uma linha delimitada por , . As colunas e o padrão que desejo imprimir são armazenados em outra variável b . O padrão a e padrão de impressão b são fornecidos abaixo:

a='15986327,415532694,850257614,875121642,20140819'
b='$1","$2","$4'

Estou tentando obter a saída como abaixo.

15986327,415532694,875121642

Estou tentando passar o padrão b para awk usando a opção -v , mas não sei como usar isso com print dentro de awk . Tentei comandos abaixo, mas esta não é a saída que eu estava tentando chegar.

echo $a |awk -v ba="${b}" -F"," '{print ba}'
$1","$2","$4

echo $a |awk -v ba="${b}" -F"," '{print $ba}'
15986327,415532694,850257614,875121642,20140819
    
por g4ur4v 26.08.2014 / 10:03

2 respostas

5

Você não precisa usar a variável ba , tente:

$ echo $a | awk -F',' '{print '"$b"'}'
15986327,415532694,875121642

Com isso, $b é expandido pelo shell, não por awk . E o resto da declaração awk não é afetado, porque eles estão entre aspas simples.

    
por 26.08.2014 / 10:11
1

awk variáveis são usadas apenas para seus valores, como variáveis na maioria das linguagens - elas não são re-analisadas para expressões. Você pode fazer o que quiser com isso:

a='15986327,415532694,850257614,875121642,20140819'
echo $a | awk -F, -v OFS=, '{print $1, $2, $4}'

(definindo OFS para que você obtenha vírgulas na saída). Se for necessário ter b como variável, você poderá usar:

b='$1, $2, $4'
echo $a | awk -F, -v OFS=, "{print $b}"

, que substitui b como parte da expressão awk .

Tudo isso dito, você não precisa de awk para isso. Este é realmente um trabalho para cut :

echo "$a" | cut -d, -f1,2,4

Isso seleciona os campos 1, 2 e 4, usando , como um delimitador de campo, sem análise dupla complexa de código. É exatamente para isso que o cut é feito.

    
por 26.08.2014 / 10:14

Tags