come selezionare e copiare colonne che non sono separate da spazio nel nuovo file?


1

Ho visto il tuo script (jcbermu) su come selezionare le colonne e copiarlo in un nuovo file. Funziona perfettamente se tutte le colonne sono delimitate da spazi (qualsiasi numero di spazi funzionerà bene). Vorrei migliorare lo script del tour per lavorare in un file con questo formato speciale:

  • La prima riga ha le intestazioni per ogni colonna (animalid snp1 snp2 ecc.) Sono separate da spazio.
  • Secondo raw: FirstColumn ha l'animale, lo spazio, quindi tutti i genotipi SNP (una cella per SNP) e sono tutti insieme come un blocco (i genotipi non sono separati da spazio).

Quindi, come dire nello script che dopo la riga 1 e dopo la colonna 1, abbiamo i dati delle colonne non separati (ogni cella è un campo).

Esempio del mio file:

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

le righe 2 e oltre hanno solo 2 parole separate da spazio, giusto?
Glenn Jackman,

Ciao Glenn: sì, dopo la riga 1 e dopo la colonna 1 ogni campo ha un solo carattere e non sono separati.
Roger Vallejo,

Risposte:


0

con awk:

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

uscite

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

0

Se ho capito bene, il file di input è questo

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

e l'output sarebbe così

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 script con strumenti 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.