Comando Sort em parte de arquivo texto [RESOLVIDO]

1. Comando Sort em parte de arquivo texto [RESOLVIDO]

Diego Tavares
diegoneto

(usa Outra)

Enviado em 30/01/2012 - 11:48h

Saudações a todos,

Eu gostaria de saber se há alguma forma de eu executar o comando sort em parte de um arquivo. Por exemplo a partir da 10ª linha.

Tenho vários arquivos que estão assim:

Arquivo1
Nome1
Parametro1
Parametro2
Parametro3
...
Fim do Arquivo1

Arquivo2
Nome2
Parametro1
Parametro2
Parametro3
...
Fim do Arquivo2

...

Mas p/f%*$% com a vida do coleguinha, tenho alguns arquivos que estão assim:

Arquivo3
Nome3
Parametro2
Parametro1
Parametro3
...
Fim do Arquivo3

Todos estão em uma pasta. Estou executando um fgrep em busca dos Parametros1, 2, 3 e demais, mas eu preciso q todos estejam em um padrão para que eu possa trabalha-los depois, mas eu preciso q Nome esteja em cima porq ele é o meu marco de início dos parâmetros. Alguém tem alguma idéia??


  


2. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 30/01/2012 - 12:00h

Olá!

Uma forma de fazer seria o seguinte:

Suponhamos que o seu arquivo (test.txt) seja:

1
2
4
6
7
3
5


E voce deseja ordenar as linhas de 3 a 7.

Para isso, pode utilizar a opção "key" do sort.

O key ordena as entradas no intervalo entre o padrão "key 1" e "key 2".

No exemplo acima seria:


#!/bin/bash

MY_FILE="test.txt"

KEY1=$(cat $MY_FILE | head -3 | tail -1) # Pega a linha 3
KEY2=$(cat $MY_FILE | head -7 | tail -1) # Pega a linha 7

# Agora ordenamos as linhas de 3 a 7 do arquivo
sort --key="$KEY1,$KEY2" $MY_FILE


O resultado de saida será:

1
2
3
4
5
6
7


Talvez alguém tenha uma melhor solução, mas pra uma emergência funciona :)

Espero ter ajudado!


3. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 30/01/2012 - 12:03h

Se quiser testar essa outra:


#!/bin/bash
# informe a partir de que linha deve-se ler os arquivos
LER_APARTIR=10

# informe o nome padrão dos arquivos (Obs.: execute esse script no diretório deles)
for arquivo in $(ls -1 arquivo*)
do
# pega a quantidade de linhas do arquivo
QTD=$(wc -l $arquivo | cut -d' ' -f1)
# subtrai pelo numero da linha a iniciar a leitura
LER_QTD=$((QTD-$LER_APARTIR))
# ler o arquivo a partir da linha especificada e faz o sort
tail -n{$LER_QTD} $arquivo | sort
done



4. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 30/01/2012 - 12:03h

Correção:

A opção "--key" do sort não utiliza padrão, e sim o intervalo de linhas, o que é mais conveniente.

Sendo assim, seu script fica resumido a:


#!/bin/bash

MY_FILE="test.txt"

# Ordena o arquivo das linhas 3 a 7
sort --key="3,7" $MY_FILE



5. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 30/01/2012 - 12:06h

rai3mb:

Sua solução realmente funciona, o problema é que ela ignora o restante do conteúdo que está fora do range ordenado.

Seria necessário um sed no final para fazer o "merge" dos dois conteúdos (não ordenado + ordenado), por exemplo.


6. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 30/01/2012 - 12:12h

Beleza, mas me parece que ele não precisa do resto ;-)

Mas em fim, depois basta fazer o merge



#!/bin/bash
LER_APARTIR=10

for arquivo in $(ls -1 arquivo*)
do
# pega a quantidade de linhas do arquivo
QTD=$(wc -l $arquivo | cut -d' ' -f1)
# subtrai pelo numero da linha a iniciar a leitura
LER_QTD=$((QTD-$LER_APARTIR))

head -n{$LER_APARTIR} $arquivo > novo_${arquivo}

# ler o arquivo apartir da linha especificada e faz o sort
tail -n{$LER_QTD} $arquivo | sort >> novo_${arquivo}

done





7. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Diego Tavares
diegoneto

(usa Outra)

Enviado em 30/01/2012 - 14:59h

Galera, valeu pela ajuda!!

Nesse caso eu preciso do restante do arquivo por causa do Nome1 que tem q estar fora do range de ordenação.

Eu consegui fazer da seguinte forma:

head -14 ArquivoTexto.txt > ArquivoTextoTemp.txt
tail -n +15 ArquivoTexto.txt | sort -f >> ArquivoTextoTemp.txt
mv -f ArquivoTextoTemp.txt ArquivoTexto.txt

Sendo 14 a linha de que eu preciso com Nome1 e o da 15 em diante, as linhas que eu preciso ordenar (e mais o restante do arquivo). Eu consigo extrair somente as linhas que eu quero trabalhar através de um fgrep depois disse código.


8. Re: Comando Sort em parte de arquivo texto [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 30/01/2012 - 23:46h

Resolveu? Marque o tópico como resolvido please ;-)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts