如何重命名多个文件中的多个列?

时间:2019-01-16 19:08:43

标签: r bash awk sed

我有多个看起来像这样的文件:

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

2 个答案:

答案 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'

此正则表达式从下划线开始直到下一个空格或制表符,删除每个单词的一部分,而不管每行有多少列。