我有以下数据集。
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
也不需要该标志:该行中只有一个匹配项需要替换。