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
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:
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
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
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