Cria cabeçalho para tabela a partir da saída do comando “colar”

0

Eu tenho pasta (dados) contém grande número de arquivos de texto. Cada arquivo de texto contém uma coluna de números, a coluna contém 30 números. Eu quero criar uma tabela que combine as colunas nesses arquivos de texto. Eu usei o seguinte comando:

  cd data
  paste *.txt > all_data.txt

A saída é a seguinte:

0.834679    0.612341    0.510057    0.580128  .....
1.837894    1.061547    0.961449    1.343096  .....
1.638215    1.024628    1.113596    1.80506  .....
1.596119    0.971842    1.14204     1.73881  .....
1.568142    1.025716    1.217219    1.769668  .....
1.554016    0.977165    1.226769    1.786335  .....
1.543137    1.001812    1.247598    1.840443  .....
1.491823    0.99437     1.28337     1.784271  .....
1.371208    0.931998    1.259749    1.717408  .....
1.390867    0.905996    1.300722    1.739213  .....
1.35813     0.283377    1.307122    1.733058  .....
......

Este comando combinou todas as colunas em uma grande planilha. Minha pergunta: existe alguma maneira de colar cada coluna nos arquivos de texto e fazer o cabeçalho do nome do arquivo de texto para essa coluna. Como segue:

text_file1  text_file2  text_file3  text_file4 ....  
0.834679    0.612341    0.510057    0.580128  .....
1.837894    1.061547    0.961449    1.343096  .....
1.638215    1.024628    1.113596    1.80506  .....
1.596119    0.971842    1.14204     1.73881  .....
1.568142    1.025716    1.217219    1.769668  .....
1.554016    0.977165    1.226769    1.786335  .....
1.543137    1.001812    1.247598    1.840443  .....
1.491823    0.99437     1.28337     1.784271  .....
1.371208    0.931998    1.259749    1.717408  .....
1.390867    0.905996    1.300722    1.739213  .....
1.35813     0.283377    1.307122    1.733058  .....
......
    
por don_crissti 27.03.2018 / 17:21

1 resposta

3

Você pode fazer:

paste_with_header() (
  IFS=$(printf '\t') # or IFS=$'\t' with some shells
  printf '%s\n' "$*"
  paste -- "$@"
)

paste_with_header text_file* > all_data.txt

"$*" é expandido para a lista de parâmetros posicionais (os argumentos para a função) associados ao primeiro caractere de $IFS , que definimos como TAB , o caractere que paste também usa para unir linhas do arquivo.

Para remover as extensões de arquivo no cabeçalho, com zsh :

paste_with_header() (
  printf '%s\n' ${(pj:\t:)@:r}
  paste -- "$@"
)
  • ${@:r} expande para o nome da raiz (extensão removida) de cada parâmetro posicional.
  • Sinalizador de expansão do parâmetro j:\t: para ingressar em \t . Com p que \t é interpretado como TAB

Ou com ksh93 , zsh ou bash , os arquivos assumidos têm uma extensão ou nenhum diretório em seus componentes de caminho contém pontos:

paste_with_header() (
  IFS=$'\t'
  printf '%s\n' "${@%.*}"
  paste -- "$@"
)

${@%.*} remove a parte mais curta que corresponde a .* do final de cada um dos parâmetros posicionais ( foo.txt se torna foo , mas lembre-se de que ./foo se torna a string vazia).

(obviamente, os nomes dos arquivos não contêm tabulações ou caracteres de nova linha).

    
por 27.03.2018 / 17:46