我有多个看起来像这样的文件:
trans_ENSG00000047849.txt.traw
trans_ENSG00000047848.txt.traw
trans_ENSG00000047847.txt.traw
...
在它们中,我大约有300列,列名看起来像这样:
NA20826_NA20826 NA20828_NA20828 NA20819_NA20819
我希望所有文件中的列名都采用这种形式:
NA20826 NA20828 NA20819
换句话说,我想删除每个列名和每个文件中下划线_之后的所有内容。
我应该提到,每个文件的开头都有一个制表符空间。
我尝试过:
sed -ri 's/[_].*$//' trans_*.txt.traw
但是当我尝试在R中打开这些转换文件之一时,出现此错误:
> e=read.table("trans_ENSG00000135541.txt.traw", header=TRUE)
Error in read.table("trans_ENSG00000135541.txt.traw", header = TRUE) :
more columns than column names
答案 0 :(得分:1)
我猜你实际上想要这个:
$ echo -e "\tNA20826_NA20826\tNA20828_NA20828\tNA20819_NA20819" | sed -r '1s/_[^\t]*//g'
NA20826 NA20828 NA20819
_[^\t]*
,因为它们是TAB
分隔的,所以从_
到TAB
之前(或行尾),要删除的内容。
g
标志将替换行中所有出现的事件。
第一个1
是要限制第一行的替换-标题行。
您自己的 s ubstitude命令's/[_].*$//'
是从第一个_
到行尾的替换,因此最后只剩下一个标题。
答案 1 :(得分:0)
您需要的sed命令是:
sed -ri 's/_\S*//g'
此正则表达式从下划线开始直到下一个空格或制表符,删除每个单词的一部分,而不管每行有多少列。