Fundindo e ordenando arquivos no Linux

, Author

Existem várias maneiras de fundir e ordenar arquivos de texto no Linux, mas como fazer isso depende do que você está tentando realizar – se você simplesmente quer colocar o conteúdo de vários arquivos em um grande arquivo, ou organizá-lo de alguma forma que o torne mais fácil de usar. Neste post, vamos olhar para alguns comandos para ordenar e fundir o conteúdo de arquivos e focar em como os resultados diferem.

Usando cat

Se tudo que você quer fazer é juntar um grupo de arquivos em um único arquivo, o comando cat é uma escolha fácil. Tudo o que tem de fazer é escrever “cat” e depois listar os ficheiros na linha de comando na ordem em que os quer incluir no ficheiro fundido. Redirecione a saída do comando para o arquivo que você deseja criar. Se já existir um ficheiro com o nome especificado, este será substituído pelo que estás a criar. Por exemplo:

$ cat firstfile secondfile thirdfile > newfile

Se quiser adicionar o conteúdo de uma série de ficheiros a um ficheiro existente em vez de o sobrescrever, basta alterar o > para >>.

$ cat firstfile secondfile thirdfile >> updated_file

Se os ficheiros que está a fundir seguirem alguma convenção de nomes conveniente, a tarefa pode ser ainda mais simples. Você não terá que incluir todos os nomes dos arquivos se você puder especificá-los usando uma expressão regular. Por exemplo, se os ficheiros terminarem todos com a palavra “ficheiro” como no exemplo acima, você pode fazer algo como isto:

$ cat *file > allfiles

Note que o comando mostrado acima irá adicionar o conteúdo do ficheiro em ordem alfanumérica. No Linux, um arquivo chamado “filea” seria adicionado antes de um chamado “fileA”, mas depois de um chamado “file7”. Afinal, não temos de pensar apenas “ABCDE” quando estamos a lidar com uma sequência alfanumérica; temos de pensar “0123456789aAbBcCdDeE”. Você pode sempre usar um comando como “ls *file” para ver a ordem em que os ficheiros serão adicionados antes de fundir os ficheiros.

NOTE: É uma boa ideia primeiro certificar-se que o seu comando inclui todos os ficheiros que quer no ficheiro fundido e nenhum outro – especialmente quando está a usar um wild card como “*”. E não se esqueça que os ficheiros integrados continuarão a existir como ficheiros separados, que poderá querer apagar assim que a integração tenha sido verificada.

Fusão de ficheiros por idade

Se quiser integrar os seus ficheiros com base na idade de cada ficheiro e não pelos nomes dos ficheiros, use um comando como este:

$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done

Usar as opções -tr (t=tempo, r=reverso) resultará numa lista de ficheiros na ordem mais antiga-primeira idade. Isto pode ser útil, por exemplo, se você estiver mantendo um registro de certas atividades e quiser o conteúdo adicionado na ordem em que as atividades foram executadas.

O $$ no comando acima representa o ID do processo para o comando quando você o executa. É completamente desnecessário usar isto, mas torna quase impossível que você inadvertidamente adicione no final de um arquivo existente ao invés de criar um novo arquivo. Se você usar $$, o arquivo resultante pode se parecer com isto:

$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914

Merging and sorting files

Linux fornece algumas maneiras interessantes de ordenar o conteúdo do arquivo antes ou depois da fusão.

Ordenar o conteúdo alfabeticamente

Se quiser que o conteúdo do ficheiro fundido seja ordenado, pode ordenar o conteúdo geral com um comando como este:

$ cat myfile.1 myfile.2 myfile.3 | sort > newfile

Se quiser manter o conteúdo agrupado por ficheiro, ordene cada ficheiro antes de o adicionar ao novo ficheiro com um comando como este:

$ for file in `ls myfile.?`; do sort $file >> newfile; done

Ordenar numericamente os ficheiros

Para ordenar numericamente o conteúdo do ficheiro, use a opção -n com sort. Esta opção só é útil se as linhas nos seus ficheiros começarem com números. Tenha em mente que, na ordem padrão, “02” seria considerado menor que “1”. Use a opção -n quando quiser garantir que as linhas são ordenadas em ordem numérica.

$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz

A opção -n também lhe permite ordenar o conteúdo do ficheiro por data se as linhas nos ficheiros começarem com datas num formato como “2020-11-03” ou “2020/11/03” (formato ano, mês, dia). Ordenar por datas em outros formatos será complicado e exigirá comandos muito mais complexos.

Usar colar

O comando colar permite-lhe juntar o conteúdo dos ficheiros linha a linha. Quando utiliza este comando, a primeira linha do ficheiro fundido irá conter a primeira linha de cada um dos ficheiros a ser fundido. Aqui está um exemplo em que usei letras maiúsculas para tornar mais fácil ver de onde vieram as linhas:

$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five

Redireccionar a saída para outro ficheiro para o guardar:

$ paste file.a file.b file.c > merged_content

Alternately, pode colar os ficheiros de forma a que o conteúdo de cada ficheiro seja unido numa única linha. Isto requer o uso da opção -s (sequencial). Repare como a saída desta vez mostra o conteúdo de cada ficheiro:

$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five

Using join

Um outro comando para unir ficheiros é join. O comando join permite-lhe fundir o conteúdo de múltiplos ficheiros com base num campo comum. Por exemplo, você pode ter um arquivo que contém números de telefone para um grupo de colegas de trabalho e outro que contém seus endereços de e-mail pessoais e ambos são listados pelos nomes dos indivíduos. Você pode usar o join para criar um arquivo com números de telefone e endereços de e-mail.

Uma restrição importante é que os arquivos devem ter suas linhas listadas na mesma ordem e incluir o campo join em cada arquivo.

Aqui está um exemplo de comando:

$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]

Neste exemplo, o primeiro campo (primeiros nomes) deve existir em cada arquivo mesmo que a informação adicional esteja faltando ou o comando falhará com um erro. Ordenar o conteúdo é útil e provavelmente muito mais fácil de gerir, mas não é necessário desde que a ordem seja consistente.

Wrap-Up

Você tem muitas opções no Linux para fundir e ordenar os dados armazenados em arquivos separados. As escolhas podem tornar algumas tarefas de outra forma tediosas surpreendentemente fáceis.

Deixe uma resposta

O seu endereço de email não será publicado.