Como adicionar cabeçalhos às colunas [duplicado]

4

Eu tenho dados:

7456 7456 0 0 0 2
7463 7463 0 0 1 2

Eu quero adicionar cabeçalhos de coluna para que a saída seja:

FID IID PAT MAT SEX PHENOTYPE 
7456 7456 0 0 0 2
7463 7463 0 0 1 2

Eu tentei echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" | cat file1 > file2

Mas isso é copiar o arquivo original e não os cabeçalhos.

sed '1i\FID, IID, PAT, MAT, SEX PHENOTYPE' file1 > file2

tem o erro

sed: 1: "1i\FID, IID, PAT, MAT,  ...": extra characters after \ at the end of i command

Algum conselho, por favor?

    
por A.M16 31.10.2017 / 16:59

6 respostas

9

Sua tentativa com

echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" | cat file1 > file2

é quase funcional, mas cat não faz nada com sua entrada padrão (contendo os cabeçalhos reais). O seguinte irá funcionar:

echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" | cat - file1 > file2

cat interpretará - como entrada padrão e inserirá a saída de echo antes de adicionar o conteúdo de file1 .

Uma alternativa:

{ echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE"; cat file1; } >file2

ou

( echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE"; cat file1 ) >file2
    
por 31.10.2017 / 17:51
7

Este GNU sed adiciona o texto como a primeira linha do arquivo:

sed  -i '1i FID IID PAT MAT SEX PHENOTYPE' test.txt
    
por 31.10.2017 / 17:07
2

Use o operador append em vez de >> :

echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" > file2 && cat file1 >> file2
    
por 31.10.2017 / 18:20
1

Vamos supor que seus dados sejam delimitados por espaço, conforme mostrado. O seguinte fará a formatação e obterá o que você deseja.

awk -vOFS="\t" '$1=$1; BEGIN { str="FID IID PAT MAT SEX PHENOTYPE"; split(str,arr," "); for(i in arr) printf("%s\t", arr[i]);print}' infile
    
por 31.10.2017 / 17:20
1

Como alternativa ao feio

echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE"

você poderia usar

head=( FID IID PAT MAT SEX PHENOTYPE )
( IFS=$'\t'; echo "${head[*]}"; cat file ) > file2

que localiza as alterações na variável IFS global em uma subshell

    
por 31.10.2017 / 18:33
1

Este erro

sed: 1: "1i\FID, IID, PAT, MAT, ...": extra characters after \ at the end of i command

ocorre porque você está no OSX (eu acho), e você deve ter uma nova linha após \ as Especificação POSIX e GNU sed permite isso. como

sed '1i\
my headers' infile

Ou, alternativamente, use:

sed -e '1i\'$'\n''my headers' infile

Além disso, se você precisar de in-loco, você deve ter -i '' ao invés de apenas -i (no OSX ou no FreeBSD).

    
por 31.10.2017 / 18:59

Tags