SED命令更改标题

时间:2014-02-20 16:45:51

标签: r unix sed awk

好吧,根据每个文件共享的第一列,我有大约114个文件,我想要并排加入,这是ID号。每个文件由2列和400,000行组成。我使用write.table将这些表连接在一个表中,然后我在标题中得到了X.例如,我的标题应该是:

  

ID 1_sample1 2_sample2 3_sample3

但我明白这样:

  

ID X1_sample1 X2_sample2 X3_sample3

我读到了这个问题并发现check.names摆脱了这个问题,但在我使用check.names的情况下,我收到以下错误:

  

“未使用的参数(check.name = F)”

因此,我决定使用sed来解决这个问题,它确实很有效,但它加入了第二行和第一行。例如,我的第一列和第二列应该是这样的:

  

ID 1_sample1 2_sample2 3_sample

     

cg123 .0235 2.156 -5.546

但我得到以下内容:

  

ID 1_sample1 2_sample2 3_sample cg123 .0235 2.156 -5.546

任何人都可以帮我查一下这段代码。我可能做错了,不让每一条线与另一条线分开。

head -n 1 inFILE | tr "\t" "\n" | sed -e 's/^X//g' | sed -e 's/\./-/' | sed -e 's/\./(/' |sed -e 's/\./)/' | tr "\n" "\t" > outFILE
tail -n +2 beta.norm.txt >> outFILE

1 个答案:

答案 0 :(得分:1)

如果您的数据是制表符分隔的,那么简单的修复就是

sed '1,1s/\tX/\t/g' < inputfile > outputfile

1,1     only operate on the range "line 1 to line 1"
\tX     find tab followed by X
/\t/    replace with tab
g       all occurrences

看起来好像你的原始尝试不只是剥离X - 它也会将连续的点更改为(-),但是你没有在你的例子中显示为什么你需要它。您的代码加入前两行的原因是您只在最后一个\n命令中将\t替换为tr - 这样您就不会在\n结束时使用\n线。

在使用第二个命令连接第2行和第2行之前,需要在第一行末尾附加head -n 1 inFILE | tr "\t" "\n" | sed -e 's/^X//g' | sed -e 's/\./-/' | sed -e 's/\./(/' |sed -e 's/\./)/' | tr "\n" "\t" > outFILE echo "\n" >> outFile tail -n +2 beta.norm.txt >> outFILE 。试用

awk

是否有效取决于您的操作系统。还有其他方法可以添加换行符......

使用awk '(NR==1){gsub(" X"," ", $0);}{print;}' inputFile > outputFile

编辑可能更清晰 - 例如

(NR==1)                for the first line only (record number == 1) do:
{gsub(" X","", $0);}   do a global substitution of "space followed by X", with "space"

                       for all lines (including the one that was just modified) do:
{print;}'              print the whole line

说明:

{{1}}