【问题标题】:Deleting rows from a tab delimited text file that contain a certain number in a string从制表符分隔的文本文件中删除字符串中包含特定数字的行
【发布时间】:2015-12-01 20:35:33
【问题描述】:

所以我有这样的数据

chr1    169845117   169845232   -   ENSG00000000457.9_exNb11
chr1    169847773   169847960   -   ENSG00000000457.9_exNb12
chr1    169771760   169771866   +   ENSG00000000460.12_exNb4
chr1    169772308   169772450   +   ENSG00000000460.12_exNb5
chr6    41046766    41046903    +   ENSG00000001167.10_exNb2
chr6    41051783    41051931    +   ENSG00000001167.10_exNb4
chr6    41057316    41057449    +   ENSG00000001167.10_exNb5
chr6    41057941    41058048    +   ENSG00000001167.10_exNb6
chr6    41059265    41059433    +   ENSG00000001167.10_exNb7
chr6    41060649    41060824    +   ENSG00000001167.10_exNb8
chr6    41062133    41062236    +   ENSG00000001167.10_exNb9
chr6    46097728    46097926    +   ENSG00000001561.6_exNb1

我想删除第 5 列中 exNb 字符串末尾有 1 的行,例如上面的最后一行。可能有一个 awk 或 sed 选项可以让我这样做,但由于我对这两种语言的经验为零,我希望有人能帮助我,我不确定这有多复杂。

编辑:想要的结果如下

chr1    169845117   169845232   -   ENSG00000000457.9_exNb11
chr1    169847773   169847960   -   ENSG00000000457.9_exNb12
chr1    169771760   169771866   +   ENSG00000000460.12_exNb4
chr1    169772308   169772450   +   ENSG00000000460.12_exNb5
chr6    41046766    41046903    +   ENSG00000001167.10_exNb2
chr6    41051783    41051931    +   ENSG00000001167.10_exNb4
chr6    41057316    41057449    +   ENSG00000001167.10_exNb5
chr6    41057941    41058048    +   ENSG00000001167.10_exNb6
chr6    41059265    41059433    +   ENSG00000001167.10_exNb7
chr6    41060649    41060824    +   ENSG00000001167.10_exNb8
chr6    41062133    41062236    +   ENSG00000001167.10_exNb9

【问题讨论】:

  • 已为您编辑。本质上唯一改变的是最后一行被删除,因为它有一个 1。如果你有生物学背景,我只是想从我的分析中删除所有第一个外显子。
  • 您只需要grep -v 'exNb1$' filename 即可排除这些行

标签: awk sed


【解决方案1】:
awk -F\\t '$5 ~ /1$/ {next} {print}' 

如果可能有尾随空格,那么您可能希望通过使用/1 *$/ 作为正则表达式来加强上述内容。如果您的文件真的像您描述的那样简单,那么您可以使用grep -v '1$'(或grep -v '1 *$')等。

当然,如果标准是基于所有尾随数字的数值,那么您必须进行调整。 (在这种情况下,您必须考虑“01”、“1E0”、“1.0”、“0.1e1”等)

【讨论】:

  • 这个好像解决了,非常感谢!只要我被允许,我会接受这个作为答案。
  • 或者只是awk '!/1$/'。请注意,tab 是默认分隔符之一。此外,我们可以简单地匹配整行,因为我们正在检查最后一列。
  • 这不会也删除以exNb11exNb21 等结尾的行吗?
  • 哦,是的,我明白了。但是您的 awk 解决方案也在这样做。 (我只是看了你的答案,而不是问题)。那么应该是grep -v '[^[:digit:]]1$'
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多