como selecionar e copiar colunas que não são separadas por espaço para novo arquivo?

1

Eu vi o seu script (jcbermu) sobre como selecionar colunas e copiar para o novo arquivo. Ele funciona perfeito se todas as colunas forem delimitadas por espaço (qualquer número de espaços funcionará bem). Eu gostaria de melhorar o script de turnê para trabalhar em um arquivo com este formato especial:

  • A primeira linha tem os cabeçalhos para cada coluna (animalid snp1 snp2 etc.), eles são separados por espaços.
  • Segundo raw: FirstColumn tem o animalid, espaço, depois todos os genótipos do SNP (uma célula por SNP) e estão todos juntos como um bloco (os genótipos não são separados por espaços).

Então, como dizer no script que depois da linha 1 e depois da coluna 1, temos dados de colunas não separados (cada célula é um campo).

Exemplo do meu arquivo:

animalid snp1 snp2 snp3 snp4 snp5 snp6 snp7 ....... snp8000
fish1 2020121 ....... 2
fish2 0202102 ....... 1
fish3 1201201 ....... 2
.
.
Fish1500 2010211 ...... 1
    
por Roger Vallejo 26.10.2017 / 19:46

2 respostas

0

com awk:

awk 'NR >= 2 {gsub(/./, "& ", $2)} 1' <<DATA
foo bar baz
abc 1234
def 5678
DATA

saídas

foo bar baz
abc 1 2 3 4
def 5 6 7 8
    
por 26.10.2017 / 21:48
0

Se eu entendi corretamente, o arquivo de entrada é este

cat fish-genotypes
animalid snp1 snp2 snp3 snp4 snp5 snp6 snp7 snp8000
fish1 20201212
fish2 02021021
fish3 12012012
Fish1500 20102111

e a saída seria assim

animalid snp1 snp2 snp3 snp4 snp5 snp6 snp7 snp8000
fish1    2    0    2    0    1    2    1    2       
fish2    0    2    0    2    1    0    2    1       
fish3    1    2    0    1    2    0    1    2       
Fish1500 2    0    1    0    2    1    1    1

Script Bash com ferramentas cli

#!/bin/bash
vert=$(cut -d' ' -f1 fish-genotypes |wc -L)
while read -a line; do
    printf "%-$((vert+1))s" ${line[0]}
    [[ "${line[1]}" =~ [[:alpha:]] ]] && {
        unset line[0]
        header=(${line[@]})
        echo ${header[@]}
        continue
    }
    for ((i=0;i<${#header[@]};i++)) {
        printf "%-$((${#header[i]}+1))s" ${line[1]:i:1}
    }
    echo
done <fish-genotypes
    
por 29.10.2017 / 23:33

Tags