【问题标题】:How to separate a column into two tab delimited columns in a text file如何在文本文件中将一列分成两个制表符分隔的列
【发布时间】:2015-11-13 19:16:51
【问题描述】:

我有一个包含 5 列的输入文件,但我需要将第 5 列分成两列,因此输出文件总共有 6 个。

我的输入文件数据如下所示:

chrX    100629986   100630758   -   ENSG00000000003.14.IntrontENST00000373020.8.Intron  
chrX    100630866   100632484   -   ENSG00000000003.14.IntrontENST00000373020.8.Intron  
chrX    100632568   100633404   -   ENSG00000000003.14.IntrontENST00000373020.8.Intron

您注意到我的所有数据中的第 5 列具有相似的结构,所以我想做的是让我的第 5 列包含 "ENSG00000000003.14.Intron" 并且我的第 6 列包含 “tENST00000373020.8.Intron”

但并非我所有的数据都有 .Intron 标签,例如:

chrX    100597503   100597531   +   ENSG00000000005.5tENST00000485971.1

但是您会注意到我的所有数据都是 "t",因此这就是我想用来分隔这些列的方法。我不确定如何对有几十万行的数据执行此操作,手动执行此操作将花费太长时间。我还需要将整个文件用制表符分隔,以便我可以继续进一步处理这些数据。

提前感谢大家,

【问题讨论】:

  • “t”字符是否出现在文件的其他位置?它总是以 ENSG + 数字和点开头吗?
  • 在“Intron”这个词之外,它有时是第 5 列中某些行的后缀,如原始帖子所示,那么不,它没有。
  • "t" 后面总是跟着 ENST + 东西吗?
  • 是的,总是 ENST 以及之后的一些数字变化。

标签: awk sed multiple-columns


【解决方案1】:

您可以使用 sed 插入标签:

sed 's/tENST/\t&/' < input > output

每个 tENST 字符串都替换为制表符 + 字符串。

对于某些 sed 版本,您可以尝试使用 $'s/tENST/\t&amp;/' 代替(即在前面添加 $)。

【讨论】:

  • 输出以下内容:CHRX 100629986 100630758-ENSG00000000003.14.INTRONTTINST0000000033020.8/44.IntrontTenst00000373020.83.14。 Intron 编辑:Yikes 不知道如何在 cmets 中格式化代码。
  • @System: 你在什么操作系统上?
  • Mac OS X 版本 10.9.5
  • 是否需要更新?整个实验室都在使用 Mac,因此未经 PI 许可,我不得进行任何更新,而且他今天不在。
  • 哇,这真的很尴尬。这完美无瑕,谢谢!我已经继续并接受了答案! :)
【解决方案2】:

有了 awk,你会写

awk -F"\t" '{sub(/tENST/, FS "tENST", $5); print}' file > output

【讨论】:

  • 如您所见,只有一个可接受的答案是可能的,而 choroba 是更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
相关资源
最近更新 更多