Problema no AWK, ao tentar mostrar a posição específica do caractere separador de um CSV quando for

1. Problema no AWK, ao tentar mostrar a posição específica do caractere separador de um CSV quando for

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 06/07/2019 - 15:12h

Necessito ler um arquivo de texto CSV com o AWK, cujo separador de colunas do arquivo é o pipe |
Como este arquivo é de cadastro de clientes ele possui categorias/tipos de linha para designar cada tipo de informação do cadastro de cada cliente.
Exemplo:
Arquivo
------------------------------------------------------------------------------------------
1|Nome|Sobrenome|Nome do Pai|Nome da Mãe|Data de Nascimento
2|CPF|RG|Título Eleitor|Nacionalidade|
3|Endereço Residencial|Número|Complemento
-------------------------------------------------------------------------------------------
Objetivo
Linha tipo 1:
2:|
7:|
17:|
29:|
41:|

Como pode ser visto acima, meu objetivo é saber a exata posição de cada separador por tipo de linha.
Obviamente que as linhas do arquivo o qual quero trabalhar são bem mais extensas do que o mero exemplo acima.
Se o separador fosse qualquer outro caractere diferente de pipe, um ponto-e-vírgula por exemplo, eu nem precisaria ter aberto este post, pois a solução a seguir seria suficiente:


while read LINHA;do
echo "$LINHA" | grep ^1 1>/dev/null 2>/dev/null
if [ $? = 0 ];then
echo "Linha Tipo 1";
fi
echo "$LINHA" | awk 'NF+=0' FS= OFS='\n' | awk -v CARACTERE=";" '$0 ~ CARACTERE {print NR}'
done <Arquivo.csv


Porém, no lugar de
CARACTERE=";" 
eu tenho
CARACTERE="|" 
e isso dá erro por que aparentemente o pipe está sendo interpretado pelo AWK.
A minha dúvida é clara: Como faço o código acima funcionar com o pipe ao invés do ; como separador?


  


2. Re: Problema no AWK, ao tentar mostrar a posição específica do caractere separador de um CSV quando

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/07/2019 - 17:56h

mlgrassi escreveu:

Necessito ler um arquivo de texto CSV com o AWK, cujo separador de colunas do arquivo é o pipe |
Como este arquivo é de cadastro de clientes ele possui categorias/tipos de linha para designar cada tipo de informação do cadastro de cada cliente.
Exemplo:
Arquivo
------------------------------------------------------------------------------------------
1|Nome|Sobrenome|Nome do Pai|Nome da Mãe|Data de Nascimento
2|CPF|RG|Título Eleitor|Nacionalidade|
3|Endereço Residencial|Número|Complemento
-------------------------------------------------------------------------------------------
Objetivo
Linha tipo 1:
2:|
7:|
17:|
29:|
41:|

Como pode ser visto acima, meu objetivo é saber a exata posição de cada separador por tipo de linha.
Obviamente que as linhas do arquivo o qual quero trabalhar são bem mais extensas do que o mero exemplo acima.
Se o separador fosse qualquer outro caractere diferente de pipe, um ponto-e-vírgula por exemplo, eu nem precisaria ter aberto este post, pois a solução a seguir seria suficiente:


while read LINHA;do
echo "$LINHA" | grep ^1 1>/dev/null 2>/dev/null
if [ $? = 0 ];then
echo "Linha Tipo 1";
fi
echo "$LINHA" | awk 'NF+=0' FS= OFS='\n' | awk -v CARACTERE=";" '$0 ~ CARACTERE {print NR}'done <Arquivo.csv


Porém, no lugar de
CARACTERE=";" 
eu tenho
CARACTERE="|" 
e isso dá erro por que aparentemente o pipe está sendo interpretado pelo AWK.
A minha dúvida é clara: Como faço o código acima funcionar com o pipe ao invés do ; como separador?

Boa tarde mlgrassi.
Segue:
while read line;do echo -e "\nLinha Tipo: ${line:0:1}"
grep -E -boa '\|' <<< "$line"|awk -F":" '{print "Posição: " $1+1}'; done<texto.txt

Para a sua solução funcionar, é só escapar o "pipe", exemplo:
 echo $linha|awk 'NF+=0' FS= OFS='\n' | awk -v CARACTERE="\|" '$0 ~ CARACTERE {print NR}'


Simplificando:
awk -F "" '{for(x=1;x<=NF;x++) if($x~/\|/) printf "%s %s\n" ,$x,x;printf "\n"}' texto.txt

Importante: => echo -e "$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')"
Att.: Marcelo Oliver






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts