web-dev-qa-db-ja.com

列にヘッダーを追加する方法

データがあります:

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

列ヘッダーを追加して、出力を次のようにします。

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

私が試してみました echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" | cat file1 > file2

しかし、これはヘッダーではなく元のファイルをコピーしています。

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

エラーがあります

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

何かアドバイスはありますか?

11
A.M16

あなたの試み

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

はほぼ機能しますが、catは標準入力(実際のヘッダーを含む)を使用して何もしません。以下が機能します:

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

cat-を標準入力として解釈し、file1の内容を追加する前にechoの出力を挿入します。

代替:

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

または

( echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE"; cat file1 ) >file2
15
Kusalananda

次のGNU sedは、ファイルの最初の行としてテキストを追加します。

sed  -i '1i FID IID PAT MAT SEX PHENOTYPE' test.txt
10
Jaroslav Kucera

代わりに追加演算子を使用してください>>

echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" > file2 && cat file1 >> file2
3
Joe Healey

このエラー

sed:1: "1i\FID、IID、PAT、MAT、...":iコマンドの最後の\の後に余分な文字

oSXを使用しているため(と思います)、\の後に POSIX仕様 およびGNU sedのように改行する必要があります。それを可能にします。

sed '1i\
my headers' infile

または、代わりに以下を使用します。

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

また、インプレースが必要な場合は、-i ''のみではなく-i(OSXまたはFreeBSD)が必要です。

2
αғsнιη

あなたが示したようにあなたのデータがスペースで区切られているとしましょう。以下は、フォーマットを行い、必要なものを取得します。

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
1

醜いものの代わりとして

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

あなたは使うことができます

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

グローバルIFS変数への変更をサブシェルにローカライズします

1
glenn jackman