2016-05-01 33 views
1

我有以下製表符分隔的輸入文件。我想刪除行尾的尾部標籤,然後在「文件」中執行該操作,這樣我就不必將修改過的數據輸出到新文件中。原因是有大量的數據,所以我不想效率低下,讀取數據然後再寫出來。在mac中刪除行尾的標籤

Hybridization REF Gene_Symbol Chromosome Genomic_Coordinate TCGA-13-A5FT-01A-11D-A409-05 TCGA-13-A5FU-01A-11D-A409-05 TCGA-29-A5NZ-01A-11D-A409-05 TCGA-3P-A9WA-01A-11D-A409-05 TCGA-59-A5PD-01A-11D-A409-05 TCGA-5X-AA5U-01A-11D-A409-05 TCGA-OY-A56P-01A-12D-A409-05 TCGA-OY-A56Q-01A-11D-A409-05 TCGA-VG-A8LO-01A-11D-A409-05 TCGA-WR-A838-01A-12D-A409-05 
cg00000029 RBL2 16 53468112 0.162232896986279 0.191627667901702 0.0712181967886229 0.0797617926225958 0.134907151266991 0.0541415985613948 0.0898579298345672 0.037865566345129 0.0681542463965581 0.101053013486289 
cg00000108 C3orf35 3 37459206 NA NA NA NA NA NA NA NA NA NA 
cg00000109 FNDC3B 3 171916037 NA NA NA NA NA NA NA NA NA NA 

要做到這一點,我一直在使用的變化:

sed -i '' 's/\t\n/\n/g' input.txt 

但這並不甚至刪除尾隨標籤。我使用Mac OS X,因此沒有GNU。解決辦法是什麼?

EDIT

我已經發布文本文件here

回答

5

任何假設\t將被sed直接解釋的答案都假設爲GNU sed,這在OSX中並不具備。然而,你有bash,所以你必須爲你的腳本一個簡單的printf轉換:

$ sed -i '' -e $'s/\t$//' input.txt 

在這種情況下,腳本被引述展開反斜槓轉義序列的報價。請注意,這是一個BASH特性,我們正在使用它來將東西更明智地放入sed。

在你的問題比較這劇本的變種,我已經把一個美元符號到搜索正則表達式來表示搜索字符串的結尾 - 這個腳本基本上說:

  • s - 替代品
  • /\t$ - 任何位於該行末尾的選項卡,
  • // - 具有空字符串。

我們不需要g(「全局」)選項進行替換,因爲sed會自動將替換應用於文件的每一行。

+0

反正我做了,但是我必須先運行'dos2unix'命令嗎? – user3313178

+0

@ghoti:感謝您對我的回答發表評論。確實讓人大開眼界。 – sjsam

+0

@ user3313178 - 很高興這爲你工作!關於dos2unix,你的問題中沒有任何東西可以表明你需要它,但你可以'cat -vet file.txt | less'或'od -c file.txt |更少「來更好地瞭解您正在處理的原始數據。如果你有DOS行結尾,有很多刪除它們的策略,在這裏很多問題可能不會在這裏重複。 :-) – ghoti

0

使用線標誌的結束($):

sed -i '' 's%\t*$%%g' input.txt 

sed表達替換零個或多個突片(\t*)與空串。

請參閱man sed

+0

'-i'後面缺少後綴。它在Linux上是可選的,但在OS X上是必需的。 – Barmar

+0

如果只有一個表達式,則不需要'-e'選項。 – Barmar

+0

@Barmar,謝謝。固定。 –