verificação de campos

1. verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 25/04/2017 - 17:21h

Olá,
tenho arquivo sequencial com 120.000 linhas que preciso colocar números de 1 a 4 em determinadas posições sendo que
eles nunca possam estar na mesma linha e se repitam na mesma linha.
Alguém pode dar uma luz ou já fez algo parecido ?
exemplo:
000001;"1";"";"";"" -> o numero 1 tem que aparecer 12 vezes nessa posição nesse arquivo de 12.000 linhas

000002;"";"2";"";"" -> o numero 2 tem que aparecer 300 vezes nessa posição nesse arquivo de 12.000 linhas

000003;"";"";"3";"" -> o numero 3 tem que aparecer 1.200 vezes nessa posição nesse arquivo de 12.000 linhas

000004;"";"";"";"4" -> o numero 4 tem que aparecer 1 vez nessa posição nesse arquivo de 12.000 linhas

Os números não podem aparecerem juntos na mesma linha no arquivo de 12.000 linhas, ex:
000005;"4";"";"";"1"
000006;"";"2";"3";"1"


  


2. Re: verificação de campos

Takahashi
signout

(usa Slackware)

Enviado em 25/04/2017 - 20:05h

Boas...
Um tempo atras tive que fazer algo parecido....
Segue o script que eu utilizei, com as alterações para o seu caso...

#!/bin/bash
line="0"
while read line ini
do
line=`expr $line + 1`
echo $ini
case ${ini} in

"1")
sed "$line s/.\{8\}/&1/" arquivo
;;
"2")
sed "$line s/.\{11\}/&2/" arquivo
;;
"3")
sed "$line s/.\{14\}/&3/" arquivo
;;
*)
;;
esac
done < <(awk '{print NR-1" "substr($0,6,1)}' arquivo)

Algumas observações:

1 - As linhas do sed estao sem a opção -i (se voce executar, mostrara na tela, mas o arquivo não será alterado.)
2 - O numero entre chavez {X} é a posição onde será inserido o caracter que esta depois do &
3 - Se voce executar mais de uma vez, os campos ficarao com caracteres repetidos (11 ao inves de 1, 22 ao inves de 2, etc)
4 - O script foi alterado baseados nas informações que voce deu.

Espero que ajude.
[]s


3. Re: verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 26/04/2017 - 09:16h

signout escreveu:

Boas...
Um tempo atras tive que fazer algo parecido....
Segue o script que eu utilizei, com as alterações para o seu caso...

#!/bin/bash
line="0"
while read line ini
do
line=`expr $line + 1`
echo $ini
case ${ini} in

"1")
sed "$line s/.\{8\}/&1/" arquivo
;;
"2")
sed "$line s/.\{11\}/&2/" arquivo
;;
"3")
sed "$line s/.\{14\}/&3/" arquivo
;;
*)
;;
esac
done < <(awk '{print NR-1" "substr($0,6,1)}' arquivo)

Algumas observações:

1 - As linhas do sed estao sem a opção -i (se voce executar, mostrara na tela, mas o arquivo não será alterado.)
2 - O numero entre chavez {X} é a posição onde será inserido o caracter que esta depois do &
3 - Se voce executar mais de uma vez, os campos ficarao com caracteres repetidos (11 ao inves de 1, 22 ao inves de 2, etc)
4 - O script foi alterado baseados nas informações que voce deu.

Espero que ajude.
[]s


Bom dia signout
ao executar o seu script ocorreu o seguinte erro:
./teste2.sh: line 21: syntax error near unexpected token `<'
./teste2.sh: line 21: `done < <(awk '{print NR-1" "substr($0,6,1)}' ARQUIVOSAIDA.txt)'

Eu já tenho um arquivo texto e quero inserir esses números (entre 1 e 4 separados por ponto e vírgula ) na frente do conteúdo do arquivo.


4. Re: verificação de campos

Takahashi
signout

(usa Slackware)

Enviado em 26/04/2017 - 11:53h

Boas,
Fiz um teste aqui e não apresentou erro (copiei e colei a partir do próprio post).
Veja se, por acaso, durante a cópia, não faltou nenhum acento ou aspas..., segue novamente

#!/bin/bash
line="0"
while read line ini
do
line=`expr $line + 1`
case ${ini} in

"1")
sed "$line s/.\{8\}/&1/" ARQUIVOSAIDA.txt
;;
"2")
sed "$line s/.\{11\}/&2/" ARQUIVOSAIDA.txt
;;
"3")
sed "$line s/.\{14\}/&3/" ARQUIVOSAIDA.txt
;;
*)
;;
esac
done < <(awk '{print NR-1" "substr($0,6,1)}' ARQUIVOSAIDA.txt)

[]s


5. Re: verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 26/04/2017 - 14:30h

signout escreveu:

Boas,
Fiz um teste aqui e não apresentou erro (copiei e colei a partir do próprio post).
Veja se, por acaso, durante a cópia, não faltou nenhum acento ou aspas..., segue novamente

#!/bin/bash
line="0"
while read line ini
do
line=`expr $line + 1`
case ${ini} in

"1")
sed "$line s/.\{8\}/&1/" ARQUIVOSAIDA.txt
;;
"2")
sed "$line s/.\{11\}/&2/" ARQUIVOSAIDA.txt
;;
"3")
sed "$line s/.\{14\}/&3/" ARQUIVOSAIDA.txt
;;
*)
;;
esac
done < <(awk '{print NR-1" "substr($0,6,1)}' ARQUIVOSAIDA.txt)

[]s


Olá, vou verificar e respondo ok...
por enquanto obrigado


6. Re: verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 26/04/2017 - 20:23h

claudio4p escreveu:

signout escreveu:

Boas,
Fiz um teste aqui e não apresentou erro (copiei e colei a partir do próprio post).
Veja se, por acaso, durante a cópia, não faltou nenhum acento ou aspas..., segue novamente

#!/bin/bash
line="0"
while read line ini
do
line=`expr $line + 1`
case ${ini} in

"1")
sed "$line s/.\{8\}/&1/" ARQUIVOSAIDA.txt
;;
"2")
sed "$line s/.\{11\}/&2/" ARQUIVOSAIDA.txt
;;
"3")
sed "$line s/.\{14\}/&3/" ARQUIVOSAIDA.txt
;;
*)
;;
esac
done < <(awk '{print NR-1" "substr($0,6,1)}' ARQUIVOSAIDA.txt)

[]s


Olá, vou verificar e respondo ok...
por enquanto obrigado


Olá, executei o comando dos2unix no arquivo e consegui rodar...
o problema é que o arquivo que é gerado fica enorme e tive que parar a geração...
Fiz um teste com um arquivo menor, e perce que para cada 5 mil linhas que o seu script lê, ele gera um arquivo
com mais de 500mb.
Como é um arquivo texto, eu achei estranho com apenas 5 campos não deveria ficar tão grande assim...


7. Re: verificação de campos

Takahashi
signout

(usa Slackware)

Enviado em 26/04/2017 - 20:32h

Boas...
Você pode enviar uma amostragem do arquivo???
Eu testei com as informações do post original e não teve problemas.



8. Re: verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 27/04/2017 - 08:33h

signout escreveu:

Boas...
Você pode enviar uma amostragem do arquivo???
Eu testei com as informações do post original e não teve problemas.


Bom dia... como não sei se dá pra mandar o arquivo por aqui, vou colocar as 100 primeiras linhas...
Esse arquivo um sequencial com 8 posições apenas sem mistério...
O meu aquivo ARQUIVOSAIDA.txt tem tamanho de 1,02MB.
Não sei se é o modo que estou executando o seu script.
Eu salvei seu script num arquivo chamado teste2.sh e executo ele dentro da pasta onde está o ARQUIVOSAIDA.txt
Já fiz assim :
$ teste2.sh
$ ./teste2.sh
a minha versão Linux é CentOS release 5.4 (Final)
00000001
00000002
00000003
00000004
00000005
00000006
00000007
00000008
00000009
00000010
00000011
00000012
00000013
00000014
00000015
00000016
00000017
00000018
00000019
00000020
00000021
00000022
00000023
00000024
00000025
00000026
00000027
00000028
00000029
00000030
00000031
00000032
00000033
00000034
00000035
00000036
00000037
00000038
00000039
00000040
00000041
00000042
00000043
00000044
00000045
00000046
00000047
00000048
00000049
00000050
00000051
00000052
00000053
00000054
00000055
00000056
00000057
00000058
00000059
00000060
00000061
00000062
00000063
00000064
00000065
00000066
00000067
00000068
00000069
00000070
00000071
00000072
00000073
00000074
00000075
00000076
00000077
00000078
00000079
00000080
00000081
00000082
00000083
00000084
00000085
00000086
00000087
00000088
00000089
00000090
00000091
00000092
00000093
00000094
00000095
00000096
00000097
00000098
00000099
00000100




9. Re: verificação de campos

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 27/04/2017 - 10:50h

claudio4p escreveu:

Olá,
tenho arquivo sequencial com 120.000 linhas que preciso colocar números de 1 a 4 em determinadas posições sendo que
eles nunca possam estar na mesma linha e se repitam na mesma linha.
Alguém pode dar uma luz ou já fez algo parecido ?
exemplo:
000001;"1";"";"";"" -> o numero 1 tem que aparecer 12 vezes nessa posição nesse arquivo de 12.000 linhas

000002;"";"2";"";"" -> o numero 2 tem que aparecer 300 vezes nessa posição nesse arquivo de 12.000 linhas

000003;"";"";"3";"" -> o numero 3 tem que aparecer 1.200 vezes nessa posição nesse arquivo de 12.000 linhas

000004;"";"";"";"4" -> o numero 4 tem que aparecer 1 vez nessa posição nesse arquivo de 12.000 linhas

Os números não podem aparecerem juntos na mesma linha no arquivo de 12.000 linhas, ex:
000005;"4";"";"";"1"
000006;"";"2";"3";"1"


Bom dia Claudio.
Considerando:
nº 1 0012 x cp1
nº 2 0300 x cp2
nº 3 1200 x cp3
nº 4 0001 x cp4
Temos um total de 1513 linhas, e as demais, como ficam?
Somente com o sequencial?
Caso positivo, segue a solução:


#!/bin/bash

for ((NL=1;NL<=120000;NL++));do
((NL<=12)) && printf "%06d;1;;;\n" $NL >> sequencial.txt
((NL>12&&NL<=312)) && printf "%06d;;2;;\n" $NL >> sequencial.txt
((NL>312 && NL<=1512)) && printf "%06d;;;3;\n" $NL >> sequencial.txt
((NL==1513)) && printf "%06d;;;;4\n" $NL >> sequencial.txt
((NL>1513)) && printf "%06d;;;;\n" $NL >> sequencial.txt
done

É gerado um arquivo de 1.3MB

att.:
marcelo oliver


10. Re: verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 27/04/2017 - 11:37h

msoliver escreveu:

claudio4p escreveu:

Olá,
tenho arquivo sequencial com 120.000 linhas que preciso colocar números de 1 a 4 em determinadas posições sendo que
eles nunca possam estar na mesma linha e se repitam na mesma linha.
Alguém pode dar uma luz ou já fez algo parecido ?
exemplo:
000001;"1";"";"";"" -> o numero 1 tem que aparecer 12 vezes nessa posição nesse arquivo de 12.000 linhas

000002;"";"2";"";"" -> o numero 2 tem que aparecer 300 vezes nessa posição nesse arquivo de 12.000 linhas

000003;"";"";"3";"" -> o numero 3 tem que aparecer 1.200 vezes nessa posição nesse arquivo de 12.000 linhas

000004;"";"";"";"4" -> o numero 4 tem que aparecer 1 vez nessa posição nesse arquivo de 12.000 linhas

Os números não podem aparecerem juntos na mesma linha no arquivo de 12.000 linhas, ex:
000005;"4";"";"";"1"
000006;"";"2";"3";"1"


Bom dia Claudio.
Considerando:
nº 1 0012 x cp1
nº 2 0300 x cp2
nº 3 1200 x cp3
nº 4 0001 x cp4
Temos um total de 1513 linhas, e as demais, como ficam?
Somente com o sequencial?
Caso positivo, segue a solução:


#!/bin/bash

for ((NL=1;NL<=120000;NL++));do
((NL<=12)) && printf "%06d;1;;;\n" $NL >> sequencial.txt
((NL>12&&NL<=312)) && printf "%06d;;2;;\n" $NL >> sequencial.txt
((NL>312 && NL<=1512)) && printf "%06d;;;3;\n" $NL >> sequencial.txt
((NL==1513)) && printf "%06d;;;;4\n" $NL >> sequencial.txt
((NL>1513)) && printf "%06d;;;;\n" $NL >> sequencial.txt
done

É gerado um arquivo de 1.3MB

att.:
marcelo oliver


Bom dia Marcelo
para as outras linha ficará assim:
000001;;;;
000002;;;;
000003;;;;
000004;;;;
000005;;;;

000012;;2;;
000021;;;3;
000038;;;3;

Vou testar a sua dica e te falo ok...
por enquanto eu agradeço...



11. Re: verificação de campos

Takahashi
signout

(usa Slackware)

Enviado em 27/04/2017 - 12:54h

Boas,

Desculpe, eu entendi errado o que voce precisa, se for realmente somente uma questão de preencher pela quantidade, então realmente o script do msoliver é a melhor solução.


12. Re: verificação de campos

Claudio Silva
claudio4p

(usa Outra)

Enviado em 27/04/2017 - 17:04h

signout escreveu:

Boas,

Desculpe, eu entendi errado o que voce precisa, se for realmente somente uma questão de preencher pela quantidade, então realmente o script do msoliver é a melhor solução.


Olá signout , sem problemas... Talvez eu não tenha explicado direito...
Assim que testar a dica do msoliver eu aviso você ok...




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts