como adicionar saída como uma nova coluna com os nomes dos arquivos

1

Como posso adicionar a saída de cada arquivo de forma incremental em uma saída singel? Eu quero fazer isso em vez de executar o comando colar em todos os arquivos juntos. É porque eu tenho 10k arquivos e cada arquivo tem 100 GB de tamanho.

arquivo1

a       1
b       2
c       3

arquivo2

a       10
b       20
c       40

arquivo3

a       0
b       0
c       0

Saída desejada

file1   file1   file2   file2   file3   file3
a       1       a       10      a       0
b       2       b       20      b       0
c       3       c       40      c       0

Eu sei que posso obter algo semelhante ao resultado desejado usando paste -d "\t" file{1..3} , mas eu quero executar a operação de um arquivo após o outro, mas não todos juntos e importante eu quero manter os nomes dos arquivos.

    
por user1703276 03.06.2017 / 14:52

1 resposta

1
O comando

paste é uma boa escolha se precisarmos apenas mesclar linhas de arquivos.

Para preceder a linha cabeçalho com nomes de arquivos use a combinação awk + colar :

{ for f in file*; do awk '{ for(i=1;i<=NF;i++) printf("%s\t",FILENAME); exit }' "$f"; done; 
echo ""; paste -d"\t" file*; } | column -t

A saída (para 3 arquivos de entrada):

file1  file1  file2  file2  file3  file3
a      1      a      10     a      0
b      2      b      20     b      0
c      3      c      40     c      0

Detalhes:

  • { command; command; ...} - usado para combinar saídas de vários comandos

  • for f in file*; - para cada arquivo

  • printf("%s\t",FILENAME) - imprime o nome do arquivo para cada coluna do respectivo arquivo

  • exit - sai imediatamente após o processamento da primeira linha

por 03.06.2017 / 16:47