Linux / Comando paste: combinar linhas de arquivos lado a lado

paste une lado a lado as linhas de arquivos pela posição: a primeira com a primeira, a segunda com a segunda, e assim por diante. O separador padrão é uma tabulação. A ferramenta não procura nomes ou identificadores iguais; para combinar registros, a ordem das entradas precisa estar correta.

Enquanto cat concatena arquivos um depois do outro, paste combina suas linhas em colunas. Se um arquivo terminar antes dos outros, suas posições restantes ficam vazias. Também é possível unir as linhas de cada arquivo em uma única linha usando -s.

Sintaxe básica e ambiente

paste [opção...] [arquivo...]

Essa linha descreve a sintaxe, não é um comando pronto para copiar. Substitua os marcadores pelas opções e pelos nomes desejados; sem arquivo, ou com - no lugar de um nome, paste lê a entrada padrão. As opções apresentadas seguem o GNU Coreutils. Confira paste --version, paste --help ou man paste no sistema em uso.

Preparar arquivos e combinar duas colunas

Abra um terminal Bash em uma pasta onde possa criar arquivos. O bloco abaixo cria um diretório exclusivo e cinco arquivos pequenos para todos os exemplos com arquivos. O encadeamento com && interrompe as etapas seguintes do bloco se a preparação falhar. Continue na mesma sessão e no diretório criado.

paste_demo=$(mktemp -d ./paste-demo.XXXXXX) &&
cd "$paste_demo" &&
printf 'Ana\nBob\n' > names.txt &&
printf '7\n12\n' > scores.txt &&
printf 'yes\nno\n' > active.txt &&
printf '7\n' > short-scores.txt &&
printf '12\n7\n' > reversed-scores.txt &&
paste names.txt scores.txt

A última linha mostra Ana ao lado de 7 e Bob ao lado de 12, com uma tabulação entre os valores. O espaço visível no terminal pode variar conforme as paradas de tabulação; não significa que paste inseriu vários espaços. O comando lê os arquivos e escreve na saída padrão, sem alterar as entradas.

Escolher um separador ou uma lista de separadores

Para usar dois-pontos entre os nomes e as pontuações:

paste -d ':' names.txt scores.txt

A saída tem duas linhas: Ana:7 e Bob:12. Em -d, o argumento é uma lista de caracteres utilizados sucessivamente entre as entradas, não uma cadeia inteira inserida em cada junção.

Com três arquivos, paste -d ':;' names.txt scores.txt active.txt produz Ana:7;yes e Bob:12;no. O primeiro separador é dois-pontos e o segundo é ponto e vírgula. No modo paralelo, a lista recomeça a cada linha de saída; se houver mais junções do que caracteres, ela também volta ao início.

Por exemplo, paste -d ':;' names.txt scores.txt active.txt names.txt produz Ana:7;yes:Ana e Bob:12;no:Bob. Já -d '::' com dois arquivos insere apenas um dois-pontos entre eles. Para juntar sem separador, o GNU paste aceita -d '\0': essa sequência representa um separador vazio, não um byte NUL.

Unir as linhas de cada arquivo com -s

Para transformar os dois nomes de names.txt em uma linha separada por vírgula:

paste -s -d ',' names.txt

O resultado é Ana,Bob. Com paste -s -d ',' names.txt scores.txt, a saída contém duas linhas: Ana,Bob e 7,12. O modo serial processa um arquivo por vez e produz uma linha por arquivo; ele não reúne automaticamente todos os arquivos em uma única linha.

Combinar entradas produzidas por comandos

No Bash, a substituição de processo <(...) permite fornecer a saída de um comando como uma entrada. Este exemplo não precisa dos arquivos de prática e não grava arquivos de dados de entrada no diretório atual:

paste -d, <(printf 'Ana\nBob\n') <(printf '7\n12\n')

Saída esperada:

Ana,7
Bob,12

O exemplo foi executado com GNU paste 8.32 no Bash do Git para Windows e produziu essas duas linhas. A sintaxe de substituição de processo depende do shell; em um shell apenas POSIX, use os arquivos preparados e execute paste -d, names.txt scores.txt. Isso reproduz a mesma combinação sem depender de <(...).

Para receber a segunda coluna por um pipe, printf '7\n12\n' | paste -d, names.txt - também retorna Ana,7 e Bob,12. Cada ocorrência de - lê a mesma entrada padrão: printf 'Ana\n7\nBob\n12\n' | paste -d, - - consome duas linhas sucessivas por linha de saída, em vez de duplicar cada linha.

Entender arquivos de comprimentos e ordens diferentes

O arquivo short-scores.txt contém apenas 7. Com paste -d, names.txt short-scores.txt, a saída é Ana,7 e Bob,. A vírgula final da segunda linha preserva a posição vazia da pontuação; paste não inventa um zero nem descarta Bob.

O arquivo reversed-scores.txt contém 12 antes de 7. Por isso, paste -d, names.txt reversed-scores.txt retorna Ana,12 e Bob,7, mesmo com término bem-sucedido. O programa não sabe se essas associações são corretas para o seu conjunto de dados. Confira a origem, a ordem e a quantidade dos registros antes de confiar na tabela resultante.

Quando as entradas têm uma chave comum, como um identificador de cliente presente em ambos os arquivos, use uma ferramenta que combine por essa chave. O guia de join em inglês explica esse tipo de combinação e a necessidade de ordenar as entradas conforme a comparação utilizada. Não ordene cada coluna isoladamente e depois use paste: isso pode destruir a relação entre os dados.

Opções principais

Opção ou argumento Uso
-d lista Reutiliza os caracteres da lista nas junções, no lugar da tabulação.
-s Une as linhas de cada arquivo separadamente, em vez de combinar arquivos em paralelo.
- Lê a entrada padrão na posição desse argumento.

Salvar e conferir o resultado

Para salvar a combinação em um arquivo novo, execute (set -C; paste -d, names.txt scores.txt > combined.txt). Após sucesso, confira com cat combined.txt. O ajuste set -C fica no comando entre parênteses e impede sobrescrever esse arquivo regular se ele já existir; nesse caso, escolha outro nome.

Não redirecione a saída para um dos arquivos de entrada: o shell pode esvaziá-lo antes de paste começar a ler. Mantenha os originais e confira tanto os valores quanto suas associações antes de substituir qualquer arquivo importante.

Uma vírgula como separador também não transforma automaticamente dados arbitrários em CSV, o formato de valores separados por vírgulas. paste não adiciona as aspas e os escapes necessários para valores que já contenham vírgulas, aspas ou quebras de linha. Para produzir esse formato com esses valores, use um gravador de CSV que trate suas regras.

Pergunta frequente

Qual é a diferença entre paste e join?

paste combina pela posição das linhas, sem comparar chaves. join procura valores correspondentes em um campo comum, com requisitos de ordenação que precisam ser respeitados. Use paste para colunas cuja correspondência por posição já foi conferida; use uma combinação por chave quando a ordem original não garante essa correspondência.

Documentação oficial

Consulte a documentação do GNU paste para o modo serial, a lista de separadores e a entrada padrão. A página de manual publicada pelo Ubuntu para Coreutils 8.32 apresenta as opções dessa versão.