tonyhts
(usa Arch Linux)
Enviado em 13/08/2015 - 19:27h
Olá,
Acredito que na vida real, o arquivo "pppp" contenha milhares de linhas e/ou existam varios "pppp's". Certo?
Seguindo essa lógica, criei um script que realiza a concatenação do jeito que vc quer. O arquivo pode ter 1 ou milhões de linhas.
Deixei o mais flexível e comentado possível para que vc possa fazer modificações.
Obviamente deve existir uma maneira mais elegante de se fazer isso, mas não ficaria flexível e tbm não pensei em outra forma, rsrsrsrs
segue:
VERSÃO 1: Vc precisa editar o script e alterar o nome do arquivo real.
#!/bin/bash
#
# Script feito para o user @gesonsa do VOL.
#
#Realiza concatenação de linhas em arquivo, seguindo 2 padrões.
#
#
#Arquivo com dos dados
arq='pppp'
#Arquivos temporários
tmp1='/tmp/arq_temp1'
tmp2='/tmp/arq_temp2'
# Arquivo Final
final=$2
#Quantidade de vezes que o looping vai rodar (monta o seq de 0 á qtd de linhas de 3 em 3)
loop=$(seq 0 3 $(wc -l $arq | sed 's/[^0-9]//g'))
#transforma o aquivo com os dados em 1 só linha
paste -s $arq > $tmp1
#Inicia o looping
for i in $loop
do sed -i 's/\s/\n/2' $tmp1 #Troca espaço por quebra linha somente na segunda ocorrência.
head -1 $tmp1 >> $tmp2 # lê a primeira linha do arquivo tratado na linha acima e adiciona ao final do tmp2
sed -i '1d' $tmp1 # exclui a linha tratada do tmp1.
sed -i 's/\s/\n/1' $tmp1 #Troca espaço por quebra linha somente na PRIMEIRA ocorrência.
head -1 $tmp1 >> $tmp2 # lê a primeira linha do arquivo tratado na linha acima e adiciona ao final do tmp2
sed -i '1d' $tmp1 # exclui a linha tratada do tmp1.
done
tr "\t" " " <$tmp2 > $final # Troca os tabs por espaços comuns.
rm -f $tmp1 $tmp2 # Pode parecer frescura, mas é importante essa linha, pois impede de contaminar o arquivo tmp2 (caso execute o Script mais de uma vez).
# Exibe o resultado
cat $final
#FIM
echo -e "\n\n O arquivo $arq foi tratado com sucesso e seu resultado foi armazenado em $final . \n\n"
VERSÃO 2: Não precisa editar nada. basta informar o nome do arquivo que contem os dados e o nome do arquivo de saída após o nomo do script. Por ex:
./script.sh arquivo_origem arquivo_tratado
#!/bin/bash
#
# Script feito para o user @gesonsa do VOL.
#
#Realiza concatenação de linhas em arquivo, seguindo 2 padrões.
#
# UTILIZAÇÃO:
# ./script.sh arquivo_origem arquivo_tratado
#Arquivo com dos dados
arq=$1
#Arquivos temporários
tmp1='/tmp/arq_temp1'
tmp2='/tmp/arq_temp2'
# Arquivo Final
final=$2
#Quantidade de vezes que o looping vai rodar (monta o seq de 0 á qtd de linhas de 3 em 3)
loop=$(seq 0 3 $(wc -l $arq | sed 's/[^0-9]//g'))
#transforma o aquivo com os dados em 1 só linha
paste -s $arq > $tmp1
#Inicia o looping
for i in $loop
do sed -i 's/\s/\n/2' $tmp1 #Troca espaço por quebra linha somente na segunda ocorrência.
head -1 $tmp1 >> $tmp2 # lê a primeira linha do arquivo tratado na linha acima e adiciona ao final do tmp2
sed -i '1d' $tmp1 # exclui a linha tratada do tmp1.
sed -i 's/\s/\n/1' $tmp1 #Troca espaço por quebra linha somente na PRIMEIRA ocorrência.
head -1 $tmp1 >> $tmp2 # lê a primeira linha do arquivo tratado na linha acima e adiciona ao final do tmp2
sed -i '1d' $tmp1 # exclui a linha tratada do tmp1.
done
tr "\t" " " <$tmp2 > $final # Troca os tabs por espaços comuns.
rm -f $tmp1 $tmp2 # Pode parecer frescura, mas é importante essa linha, pois impede de contaminar o arquivo tmp2 (caso execute o Script mais de uma vez).
# Exibe o resultado
cat $final
#FIM
echo -e "\n\n O arquivo $arq foi tratado com sucesso e seu resultado foi armazenado em $final . \n\n"
OBS::: Não esqueça de atribuir permissão de execução ao script.
chmod +x script.sh
Espero que ajude.
abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.
--- Mestre dos Mestres - Alan Turing ---