공백으로 구분되지 않은 열을 새 파일로 선택하고 복사하는 방법? 스크립트를 개선하고 싶습니다. 첫 번째

열을 선택하고 새 파일에 복사하는 방법에 대한 (jcbermu) 스크립트를 보았습니다. 모든 열이 공백으로 구분 된 경우 (모든 공백이 잘 작동 함) 완벽하게 작동합니다. 이 특수 형식의 파일에서 작업하도록 둘러보기 스크립트를 개선하고 싶습니다.

  • 첫 번째 행은 각 열 (animalid snp1 snp2 등)에 대한 헤더를 가지며 공백으로 구분됩니다.
  • 두 번째 행 : 첫 번째 열에는 동물의 공간, 그 다음 모든 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


답변

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

답변

내가 올바르게 이해한다면 입력 파일은 다음과 같다.

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

cli 도구가있는 bash 스크립트

#!/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