2014-02-20 58 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