Classifique vários arquivos com o bash

1

Eu tenho uma pergunta que envolve a linguagem de script bash.

Eu tenho vários diretórios

  • /studentName
  • /studentMail
  • /studentNumber

Em cada um desses diretórios, existe um arquivo name.txt , mail.txt , number.txt .

Agora eu preciso criar uma função que faça o mesmo que a função SELECT de um banco de dados MySQL. Não precisa ler uma única linha. Basta exibir todo o conteúdo desses três arquivos e organizá-los. o que significa que eu preciso de algo assim como saída.

studentname | studentmail | studentnumber

Eu criei duas maneiras.

primeiro:

cat /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt > summary
cat summary

Isto irá mostrar todo o conteúdo dos 3 arquivos um sob o outro, o que obviamente não é bom.

Eu também inventei isso:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt

Isso exibe todo o conteúdo, mas ainda não está realmente classificado. E eu também preciso mais tarde apenas selecionar uma linha para ser exibida.

Alguém pode me ajudar a fazer isso?

PS: Eu sei sobre sort , mas todos os conteúdos são exibidos um no outro, de alguma forma eu não estou fazendo certo?

    
por bryan 01.06.2011 / 20:03

2 respostas

2

Como os arquivos são classificados agora? A linha 3, digamos, dos três arquivos se refere ao mesmo aluno? Nesse caso, você poderia expandir sua paste solution para isso:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt | sort

que ordenaria todos os registros (linhas) pelo nome do aluno. Você poderia classificar por algum outro campo usando as opções apropriadas para sort .

Para selecionar uma única linha a ser exibida, siga qualquer comando que forneça uma lista classificada corretamente com grep , por exemplo,

paste ... | sort | grep 'pattern'

onde "padrão" seria seu critério de pesquisa na forma de uma expressão regular. Claro, se você está selecionando apenas uma linha, não há necessidade de sort .

Outro comando que você pode achar útil é join , mas eu não sei o suficiente sobre isso para dar um exemplo de seu uso.

Atualização: formatação com awk

A saída do comando paste acima é uma seqüência de linhas, cada linha consistindo em três campos separados uns dos outros por guias, ou seja,

Estas linhas podem ser formatadas colocando-as no seguinte comando awk .

awk -F '\t' '{printf "%-20s%-16s%s\n", $1, $2, $3}'

O argumento -F '\t' especifica que o separador do campo de entrada é um caractere de tabulação. Isso separará as linhas de entrada em três campos aos quais awk se refere, por $1 , $2 e $3 . A linguagem awk inclui uma função printf que se comporta essencialmente da mesma forma que a função printf() da biblioteca C. A string de formato acima especifica três campos de string. O primeiro, %-20s , especifica que o parâmetro de string correspondente seja justificado à esquerda em um campo de 20 caracteres. O segundo, %-16s , especifica que seu parâmetro seja justificado à esquerda em um campo de 16 caracteres. O último, %s , apenas acrescenta seu parâmetro ao que foi formatado até o momento. Finalmente, o \n coloca uma nova linha no final para que cada linha de entrada seja formatada para uma linha de saída separada.

Para ajustar a saída ao seu gosto, basta alterar as larguras do campo e / ou remover os sinais de menos para justificar as cordas à direita. Para mais opções, consulte as páginas awk e printf man.

    
por 01.06.2011 / 20:35
1

se você quiser ordenar cada arquivo, cole os dados classificados, com o bash você pode usar a substituição de processos:

paste -d '|' <(sort file1) <(sort file2) <(sort file3)
    
por 02.06.2011 / 01:50