sedを使用してヘッダー内の複数の項目を変更する

sedを使用してヘッダー内の複数の項目を変更する

次のデータセットがあります。

CHROM   POS     N_ALLELES       N_CHR   {ALLELE:FREQ}
6       85401233        2       46      T:1     A:0
6       85401234        2       46      C:1     G:0
6       85401235        2       46      T:1     G:0

5列のヘッダを変更した後、2列に分けたいと思います。

REF     ALT
T:1     A:0
C:1     G:0
T:1     G:0

sed を使用して ':' をタブ区切り文字に変換できます。効果がある

sed '1s/\:/\t/g' filename 

しかし、このコマンドは私が望むようには機能しません。

sed '1s/\{ALLELE:/ALT\t/g' filename

次のメッセージを提供します。

sed: -e expression #1, char 20: Invalid preceding regular expression

そして

sed '1s/\:/\t/g' | '1s/\{ALLELE/REF /g' filename

-bash: 1s/\{ALLELE/REF /g: No such file or directory

ベストアンサー1

ファイルの内容を変更するにはed標準エディタが必要です。

$ cat filename
CHROM   POS     N_ALLELES       N_CHR   {ALLELE:FREQ}
6       85401233        2       46      T:1     A:0
6       85401234        2       46      C:1     G:0
6       85401235        2       46      T:1     G:0
$ printf '%b\n' '1s/{ALLELE:FREQ}/REF\011ALT/' 'w' 'q'|ed -s filename
$ cat filename
CHROM   POS     N_ALLELES       N_CHR   REF     ALT
6       85401233        2       46      T:1     A:0
6       85401234        2       46      C:1     G:0
6       85401235        2       46      T:1     G:0
  • '1s/{ALLELE:FREQ}/REF\011ALT/'行1に移動して置き換えます。\011tabに変換されたタブ文字の8進数表現ですprintf

  • 'w' 'q'ファイルへの変更を保存し、エディタを終了します。


sed '1s/\{ALLELE:/ALT\t/g' filename

\{デフォルトの正規表現が特別なので失敗します。あなたが意味するものは簡単です{

そしてここ

sed '1s/\:/\t/g' | '1s/\{ALLELE/REF /g' filename

最初のsedに入力ファイルを提供していないので失敗しました。正確で直接的なsedコマンドは次のとおりです。

sed '1s/{ALLELE:FREQ}/REF\tALT/' filename

そのフラグも必要gありません。行に置き換える必要がある一致は1つだけです。

おすすめ記事