Ajuda com script [RESOLVIDO]

1. Ajuda com script [RESOLVIDO]

Joao Vitorino
joao_vitorino

(usa Red Hat)

Enviado em 26/03/2014 - 17:30h

Pessoal
Fiz o seguinte script abaixo.
Ele faz o seguinte (ou deveria fazer)

Em um arquivo, ele identifica quais linhas começam com a mesma palavra e mantém somente a primeira linha com essa palavra e exclui as demais.

Ex:

Arquivo original contém.
ABC;1234
ABC;ZZZZ
AAA;1234
BBB;1234

Arquivo de saída fica assim.
ABC;1234
AAA;1234
BBB;1234

O script que fiz ficou assim.

#!/bin/bash -x

FILE='/tmp/file.csv'
exec 3<> $FILE
CONT_LINHA=0
while read LINE <&3;
do
((CONT_LINHA++))
B1=$(head -$CONT_LINHA $FILE |tail -1 |cut -d ";" -f1)
B2=$(head -$(expr $CONT_LINHA + 1) $FILE |tail -1 |cut -d ";" -f1)
if [ "$B1" = "$B2" ];
then
DELETED=$(expr $CON_LINHA + 1)
sed -i "$DELETEDd" $FILE
fi
done < $FILE

exec 3>&-
exit




  


2. MELHOR RESPOSTA

Fernando
phoemur

(usa FreeBSD)

Enviado em 04/08/2014 - 20:08h

Outro pra quem não entende de hieróglifos, mas conhecidos como expressões regulares kkk:


cut -d';' -f1 < arquivo | sort | uniq | xargs -i grep -m1 {} arquivo


3. Re: Ajuda com script [RESOLVIDO]

Marcos Paulo Ferreira
daemonio

(usa Slackware)

Enviado em 30/07/2014 - 10:13h

O sed pode substituir a duplinha head | tail para pegar uma linha específica.

Por exemplo, para ir direto na linha 25do arquivo, com o sed fica:


sed -n 25p


Eu não entendi o que seu script deve fazer. Ele remove linhas duplicadas (com a mesma palavra inicial)? Se for, tem uma solução mais simples e elegante, que é executar um sort e depois uniq.


4. Re: Ajuda com script [RESOLVIDO]

Joao Vitorino
joao_vitorino

(usa Red Hat)

Enviado em 04/08/2014 - 13:34h

daemonio escreveu:

O sed pode substituir a duplinha head | tail para pegar uma linha específica.

Por exemplo, para ir direto na linha 25do arquivo, com o sed fica:


sed -n 25p


Eu não entendi o que seu script deve fazer. Ele remove linhas duplicadas (com a mesma palavra inicial)? Se for, tem uma solução mais simples e elegante, que é executar um sort e depois uniq.


Em primeiro lugar obrigador pela ajuda daemonio.

o sed -n 25p, não me atende pq não sei qual o número da linha que estão as informações duplicadas.
o sort e depois uniq tbm não me atende pq preciso dos dados apenas da primeira linha que tem os dados duplicados ( as linhas não são identicas, apenas a primeira palavra de cada linha que pode ou não ser igual a da linha seguinte.


para ficar melhor de entender, abaixo um exemplo do arquivo a ser editado pelo script.

Server1; HD001, MEM, ABC123
Server1; HD002; MEMORIA, USUÀRIO
Server3; HD001; MEM; XYZ
Server4; HD001; MEM; 5678
Server001; HD001; ETC

Quero somente 1 linha para cada servidor no arquivo de saída. Ficaria assim.

Server1; HD001, MEM, ABC123
Server1; HD002; MEMORIA, USUÀRIO
Server3; HD001; MEM; XYZ
Server4; HD001; MEM; 5678
Server001; HD001; ETC

Mas esse arquivo é variavel, não sei que linha estão os servidores repetidos, não sei quais são os servidores repetidos e nem quantas vezes ele se repete.





5. Re: Ajuda com script [RESOLVIDO]

Fernando
phoemur

(usa FreeBSD)

Enviado em 04/08/2014 - 20:02h

Acho que talvez esse comando aqui possa resolver:


awk -F';' '{ if (a[$1]++ == 0) print $0; }' arquivo


ou então


awk -F';' '!_[$1]++' arquivo


Também aprendi resolvendo isso.

Um fraterno abraço.


6. Re: Ajuda com script [RESOLVIDO]

Joao Vitorino
joao_vitorino

(usa Red Hat)

Enviado em 07/08/2014 - 16:40h

phoemur escreveu:

Outro pra quem não entende de hieróglifos, mas conhecidos como expressões regulares kkk:


cut -d';' -f1 < arquivo | sort | uniq | xargs -i grep -m1 {} arquivo


Obrigado phoemur. Isso me ajudou.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts