msoliver
(usa Debian)
Enviado em 07/03/2019 - 20:34h
eSales escreveu:
É o seguinte, o código abaixo:
cut -d';' -f5 principal.txt | grep -n [[:alpha:]] | cut d':' -f1 > linhas.txt
gera um arquivo (linhas.txt) com os números das linhas que quero apagar do arquivo chamado principal.txt.
$ cat linhas.txt
4788
4789
4790
4791
4792
8441
28674
32322
32323
32324
52563
52564
...
Então após isso, utilizo o arquivo linhas.txt dentro de um loop pra apagar as linhas específicas do arquivo principal.txt, usando o sed e endereçando pelo número das linhas que estão contidas no arquivo linhas.txt:
for i in $(cat linhas.txt)
do sed -i "${i}d" principal.txt #primeiro caso fica assim: sed -i "4788d" principal.txt, e assim por diante.
done
Então nada acontece, as linhas do arquivo principal.txt após rodar o script continuam "intactas".
Marcelo Oliver, entendi toda a lógica de sua sugestão, porém nunca utilizei o awk. Vou pesquisar mais sobre ele e ver se ajuda no meu caso.
Abraços!
Boa noite ESales.
Segue uma pequena explicação:
cat arquivo.txt
123456;123456;14444;545543;Linha01;123456;123456
123456;123456;14444;545543;Linha02;123456;123456
123456;123456;14444;545543;Linha03;123456;123456
123456;123456;14444;545543;LinhaQuatro;123456;123456
123456;123456;14444;545543;Linha05;123456;123456
123456;123456;14444;545543;Linha06;123456;123456
123456;123456;14444;545543;linhaSete;123456;123456
123456;123456;14444;545543;Linha08;123456;123456
123456;123456;14444;545543;LinhaNOVE;123456;123456
123456;123456;14444;545543;Linha10;123456;123456
O comando:
awk -F";" '$5~/^[[:alpha:]]+$/ {printf "%s\n" ,$5}' arquivo.txt
Busca em arquivo.txt, onde o campo 5 tem SOMENTE "^[[:alpha:]]"
-F";" => IFS, separador de campo
'$5~/^[[:alpha:]]+$ => $%=Campo 5, ^[[:alpha:]]{1,}$ => SOMENTE "^[[:alpha:]]", no minimo 1
{printf "%s\n" ,$5}' => imprime o campo 5
LinhaQuatro
linhaSete
LinhaNOVE
Com o comando:
awk -F";" '$5~/^[[:alpha:]]{1,}$/ {printf "%sd;" ,NR}' arquivo.txt
4d;7d;9d;
Temos o nº das linhas, já no formato do sed: "4d;7d;9d;"
NR é o numero da linha onde "casou" a REGEX
Finalizando:
linhas=$(awk -F";" '$5~/^[[:alpha:]]{1,}$/ {printf "%sd;" ,NR}' arquivo.txt)
sed -i "${linhas}" arquivo.txt
O "awk", substitui os três comandos abaixo:
cut -d';' -f5 principal.txt | grep -n [[:alpha:]] | cut d':' -f1 > linhas.txt
É isso . . .
Abç.:
Marcelo Oliver