删除mac中一行末尾的制表符

时间:2016-05-01 09:40:19

标签: bash macos shell sed

我有以下以制表符分隔的输入文件。我想删除行末尾的尾随标签,并在文件"中执行#34;这样我就不必将修改后的数据输出到新文件中。这样做的原因是存在大量数据,因此我不想低效并读取数据然后再将其写出来。

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。解决方案是什么?

修改

我已发布文本文件here

2 个答案:

答案 0 :(得分:5)

任何假设\t的答案将由sed直接解释,假设是GNU sed,这是OSX中没有的。但是你有bash,所以你的脚本有一个简单的printf转换:

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

在这种情况下,脚本引用了扩展反斜杠转义序列的引号。请注意,这是一个BASH功能,我们用它来更明智地将内容放入sed。

将此与您问题中的脚本变体相比较,我在搜索正则表达式中加上一个美元符号表示搜索字符串的结尾 - 这个脚本基本上说:

  • s - 替换
  • / \t$ - 位于该行末尾的任何标签
  • // - 空字符串。

我们不需要替换g(“全局”)选项,因为sed会自动将替换应用于文件的每一行。

答案 1 :(得分:0)

使用行尾标记($):

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

sed表达式用空字符串替换零个或多个制表符(\t*)。

请参阅man sed