mesclando todos os arquivos em um arquivo?

1

Eu estava tentando mesclar todos os arquivos de texto em um arquivo. Todos os arquivos de texto têm uma coluna e um número igual de linhas. Meus nomes de arquivos de dados são data_1.txt, data_2.txt, data_3.txt,. . . data_n.txt. onde n é o número de arquivos de texto a serem mesclados. Eu quero a mesclagem de 1 a n na ordem deles. Eu tentei o seguinte código, mas não funciona como eu queria. Não mantém a ordem das colunas.

Meus dados de amostra parecem

data_1.txt

0.020085
0.0017361
0.77963
0.98659
0.33102
0.099835
0
0
0.073004
0.29978

data_2.txt

0.021407
0.0017191
0.82385
1.0449
0.34593
0.10535
0
0
0.078362
0.31509

data_3.txt

0.022706
0.0016876
0.85447
1.0922
0.35556
0.11063
0
0
0.083983
0.32536

saída obrigatória

combined.txt

0.020085    0.021407    0.022706
0.0017361   0.0017191   0.0016876
0.77963 0.82385 0.85447
0.98659 1.0449  1.0922
0.33102 0.34593 0.35556
0.099835    0.10535 0.11063
0   0   0
0   0   0
0.073004    0.078362    0.083983
0.29978 0.31509 0.32536

Por favor, ajudem-me a corrigir o meu problema.

#!/bin/bash
paste data_*.txt > combined.txt
    
por AiB 11.08.2014 / 10:28

3 respostas

3

Com zsh , você pode afetar a ordenação de gerações de nome de arquivo com qualificadores glob:

paste file_*.txt(n)

ativaria a classificação numérica , que é colocada file_10.txt depois file_9.txt

Observe que, se seus arquivos terminarem em caracteres CR (como quando eles vêm do mundo da Microsoft), quando a saída para um terminal, esse caractere move o cursor para a primeira coluna.

Portanto, para um arquivo contendo A\rB\rC\rn (como aconteceria se você usasse paste d dils formatados em MS-DOS), cat that-file pareceria exibir apenas C . Você pode se livrar desses caracteres CR canalizando o acima para tr -d '\r'

    
por 11.08.2014 / 12:10
2

Você pode usar expansão de chaves com paste para forçar um pedido :

$ paste data_{1..3}.txt
0.020085    0.021407    0.022706
0.0017361   0.0017191   0.0016876

As chaves se expandem para várias palavras, cada uma com as partes à esquerda e à direita das chaves. A sintaxe n..m é uma expressão de sequência :

A sequence expression takes the form {x..y[..incr]}, where x and y are either integers or single characters, and incr, an optional increment, is an integer. When integers are supplied, the expression expands to each number between x and y, inclusive.

A linha de comando acima será expandida para:

paste data_1.txt data_2.txt data_3.txt

que inclui os arquivos na ordem correta. Você pode alterar o 3 para qualquer número de arquivos para obter todos os nomes de arquivos apropriados.

O comando paste une seus argumentos de arquivo em colunas, na ordem em que são dados como argumentos, portanto, a ordem dos argumentos é importante. Quando você usa * , os nomes dos arquivos são expandidos em ordem alfabética, o que será errado quando você tiver 10 ou mais arquivos, e assim as colunas terminarão fora de ordem. Para arquivos de 1 a 9, você estaria bem de qualquer forma.

    
por 11.08.2014 / 11:55
-1
paste -d " " 1.txt 2.txt > 4.txt

Existe outra maneira de usar awk :

$ awk '{printf "%s",$1; getline < "1.txt" ; printf " %s\n",$1}' 2.txt
    
por 11.08.2014 / 11:15