我有以下以制表符分隔的输入文件。我想删除行末尾的尾随标签,并在文件"中执行#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
答案 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
。