padrão awk
não é muito bom em extrair dados de campos baseados em padrões. Algumas opções incluem:
-
split()
para dividir o texto em um array baseado em delimitadores especificados. -
match()
, que define as variáveisRSTART
eRLENGTH
para indicar onde a correspondência ocorreu e, em seguida, usesubtr()
para extrair a parte correspondente.
Então, aqui:
awk -F'|' -v OFS='|' '
split($3, a, /[=:]/) >= 2 {print $1, $2, a[2]}' < file.txt
Então, retorna a parte entre a primeira e a segunda ocorrência de um =
ou :
em $3
.
Ou:
awk -F'|' -v OFS='|' '
match($3, /=[^:]*/) {
print $1, $2, substr($3, RSTART+1, RLENGTH-1)
}' < file.txt
O GNU awk
tem uma extensão gensub()
que traz a funcionalidade do comando sed
s
para awk
:
gawk -F'|' -v OFS='|' '
$3 ~ /=/ {
print $1, $2, gensub(/^[^=]*=([^:]*).*/, "\1", 1, $3)
}' < file.txt
Procura por =
seguido por qualquer número de não :
s e extrai a parte depois de =
. O problema com gensub()
é que você não pode dizer facilmente se a substituição foi bem-sucedida ou não, portanto, verifique se $3
contém =
primeiro.
com sed
:
sed -n 's/^\([^|]*|[^|]*|\)[^=|]*=\([^:|]*\).*//p' < file.txt
com perl
:
perl -F'[|]' -lane 'print "$F[0]|$F[1]|$1" if $F[2] =~ /=([^:]*)/' < file.txt