2014-02-20 56 views
0

嗯,我想要基于每个文件共享的第一列并排加入114个文件,这是ID编号。每个文件由2列和400000多行组成。我用write.table将这些表格连接在一张表格中,并在头文件中获得了X。例如,我的头应该是这样的:改变标题的SED命令

ID 1_sample1 2_sample2 3_sample3

,但我得到这样的:

ID X1_sample1 X2_sample2 X3_sample3

我读到这个问题,并发现了check.names摆脱这个问题的,但对我来说当我使用check.names我得到以下错误:

"unused argument (check.name = F)"

因此,我决定用sed来解决这个问题,它实际上的伟大工程,但它加入了2号线和1号线。例如,我的第一栏和第二栏应该是这样的:

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

尝试改善您的拼写和您的格式,确保我们能理解你的意思。另外,一些示例输入和期望的输出将会很有帮助。 – fedorqui

+0

改进的格式将有所帮助,但肯定有一种方法可以在R中正确完成要查找的内容。你可以分享一些实际的数据(粘贴'dput(head(yourdata)'')的结果)。 – Justin

+1

多个字段的文本处理通常最容易使用'awk'完成。显示一个“输入行”和“所需的输出行”,解释你想达到的差异,你会得到一些很好的答案。 – Floris

回答

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 - 它也改变相继点到(-)但你不会在你的例子中显示你为什么需要这个。您的代码加入前两行的原因是,您只在最后一条tr命令中将\n替换为\t - 这会在行尾没有\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 
+0

我删除我的答案..我会告诉我是否可以这样做 – MLSC

+0

@MortezaLSC - 我已经更新了我的回答,以显示它是如何完成的... – Floris

+0

嗨@Floris我已经使用过'awk'命令,但它并没有在开始时摆脱X.我尝试过修复看看,但它也没有工作。生成一个只有'\ n'的文件 – user2997397