1

Я видел ваш (jcbermu) скрипт о том, как выбирать столбцы и копировать в новый файл. Это прекрасно работает, если все столбцы разделены пробелами (любое количество пробелов будет работать нормально). Я хотел бы улучшить скрипт тура для работы в файле с этим специальным форматом:

  • В первой строке есть заголовки для каждого столбца (animalid snp1, snp2 и т.д.), В которых они разделены пробелом.
  • Второй необработанный: FirstColumn содержит animalid, space, затем все генотипы SNP (одна клетка на SNP), и все они вместе как блок (генотипы не разделены пробелом).

Итак, как сказать в скрипте, что после строки 1 и после столбца 1 у нас столбцы данных не разделены (каждая ячейка - это одно поле).

Пример моего файла:

animalid snp1 snp2 snp3 snp4 snp5 snp6 snp7 ....... snp8000
fish1 2020121 ....... 2
fish2 0202102 ....... 1
fish3 1201201 ....... 2
.
.
Fish1500 2010211 ...... 1

2 ответа2

0

с awk:

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

выходы

foo bar baz
abc 1 2 3 4
def 5 6 7 8
0

Если я правильно понял, входной файл это

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

и вывод будет таким

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

Скрипт Bash с инструментами 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .