2016-05-01 37 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,谢谢。固定。 –