データがあります:
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
何かアドバイスはありますか?
あなたの試み
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
次のGNU sed
は、ファイルの最初の行としてテキストを追加します。
sed -i '1i FID IID PAT MAT SEX PHENOTYPE' test.txt
代わりに追加演算子を使用してください>>
:
echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE" > file2 && cat file1 >> file2
このエラー
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)が必要です。
あなたが示したようにあなたのデータがスペースで区切られているとしましょう。以下は、フォーマットを行い、必要なものを取得します。
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
醜いものの代わりとして
echo -e "FID\tIID\tPAT\tMAT\tSEX\tPHENOTYPE"
あなたは使うことができます
head=( FID IID PAT MAT SEX PHENOTYPE )
( IFS=$'\t'; echo "${head[*]}"; cat file ) > file2
グローバルIFS変数への変更をサブシェルにローカライズします