使用 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 行并进行替换。\011是制表符的八进制,通过 转换为制表符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也不需要该标志:该行中只有一个匹配项需要替换。

相关内容