Combinar e transformar arquivos de texto

LinuxBeginner
Pratique Agora

Introdução

Os arquivos de texto podem se relacionar de maneiras diferentes. Às vezes, é preciso normalizar caracteres; em outras situações, duas listas correspondem pela posição das linhas; também pode haver registros que compartilham uma chave. Escolher a ferramenta adequada é mais importante do que memorizar opções.

Neste laboratório, você conhecerá três ferramentas específicas: tr transforma um fluxo de caracteres, paste combina linhas pela posição e join combina registros classificados por um campo compartilhado. Você observará cada entrada e verificará o arquivo resultante antes de criar um pequeno relatório.

Traduzir e limpar um fluxo de caracteres

Nesta etapa, você usará tr para traduzir caracteres, agrupar separadores repetidos e remover caracteres indesejados.

Crie uma linha propositalmente inconsistente. Em seguida, cat -A torna visíveis detalhes que normalmente não aparecem: os espaços continuam visíveis como intervalos, e $ indica o fim da linha. Isso ajuda você a identificar exatamente o que precisa ser limpo:

cd /home/labex/project/text-combine-lab
printf '  API,,,Worker,,WEB  \n' > raw-services.txt
cat -A raw-services.txt

tr SET1 SET2 substitui os caracteres do primeiro conjunto pelos caracteres correspondentes do segundo. As classes portáveis [:upper:] e [:lower:] representam letras maiúsculas e minúsculas:

tr '[:upper:]' '[:lower:]' < raw-services.txt

Agora, encadeie três etapas com um pipeline. A primeira traduz entre maiúsculas e minúsculas; tr -s ',' compacta cada sequência de vírgulas repetidas em uma única vírgula; tr -d ' ' remove os caracteres de espaço; e tee exibe e salva o fluxo final:

tr '[:upper:]' '[:lower:]' < raw-services.txt | tr -s ',' | tr -d ' ' | tee clean-services.txt

O resultado deve ser api,worker,web. tr lê um fluxo; ele não edita o arquivo de entrada diretamente.

Mesclar linhas correspondentes com Paste

Nesta etapa, você combinará arquivos cujas primeiras linhas correspondem entre si, cujas segundas linhas correspondem entre si e assim por diante.

Crie uma coluna com nomes de serviços e outra com os responsáveis:

cd /home/labex/project/text-combine-lab
printf '%s\n' api worker web > services.txt
printf '%s\n' team-blue team-green team-blue > owners.txt

Por padrão, paste coloca as linhas correspondentes lado a lado usando uma tabulação:

paste services.txt owners.txt

Escolha a vírgula como delimitador com -d, e use tee para exibir e salvar um arquivo semelhante a CSV:

paste -d, services.txt owners.txt | tee service-owners.csv

paste não compara chaves. Se um arquivo tiver linhas ausentes ou reordenadas, a associação entre as linhas mudará.

Fazer junção de registros por uma chave compartilhada

Nesta etapa, você combinará registros por um primeiro campo correspondente, em vez de usar a posição das linhas.

Crie duas tabelas delimitadas por espaços e em ordens diferentes:

cd /home/labex/project/text-combine-lab
printf '%s\n' 'web 8080' 'api 9000' 'worker 9100' > ports-unsorted.txt
printf '%s\n' 'worker active' 'web active' 'api maintenance' > states-unsorted.txt

join espera que ambas as entradas estejam classificadas pelo campo usado na junção. Prepare cópias classificadas. Em sort -k1,1, -k seleciona uma chave, e 1,1 significa “começar e terminar no campo 1”; portanto, apenas o nome do serviço controla a ordem:

sort -k1,1 ports-unsorted.txt > ports.txt
sort -k1,1 states-unsorted.txt > states.txt

Inspecione os arquivos e faça a junção dos valores correspondentes do campo 1:

cat ports.txt
cat states.txt
join ports.txt states.txt | tee service-details.txt

Cada resultado contém uma vez a chave de serviço compartilhada, seguida pela porta e pelo estado.

Criar um relatório de serviços legível

Nesta etapa, você reorganizará os registros unidos sem alterar as tabelas de origem.

Converta os espaços em vírgulas para produzir um relatório simples:

cd /home/labex/project/text-combine-lab
tr ' ' ',' < service-details.txt | tee service-report.csv

Adicione um cabeçalho agrupando dois comandos. As chaves enviam a saída dos dois comandos para um único redirecionamento:

{ echo 'service,port,state'; cat service-report.csv; } > service-report-with-header.csv
cat service-report-with-header.csv

Conte os registros de dados sem contar o cabeçalho:

tail -n +2 service-report-with-header.csv | wc -l | tr -d ' ' > service-count.txt
cat service-count.txt

Esse fluxo mantém pequenas etapas fáceis de inspecionar: dados normalizados, dados unidos, dados formatados e, por fim, o relatório final.

Resumo

Você usou tr para a normalização em nível de caracteres, paste para criar colunas por posição e join para relacionar chaves em arquivos classificados. Depois, combinou pequenas etapas para criar um relatório CSV legível, mantendo intactos os arquivos de entrada originais.