【问题标题】:extract specific row with numbers over N提取数字超过 N 的特定行
【发布时间】:2021-12-22 18:42:28
【问题描述】:

我有一个这样的数据框

1  3  MAPQ=0;CT=3to5;SRMAPQ=60
2  34  MAPQ=60;CT=3to5;SRMAPQ=67
4  56  MAPQ=67;CT=3to5;SRMAPQ=50
5  7  MAPQ=44;CT=3to5;SRMAPQ=61

使用 awk(或其他)

我想提取只有 SRMAPQ 超过 60 的行。

这意味着输出是

2  34  MAPQ=60;CT=3to5;SRMAPQ=67
5  7  MAPQ=44;CT=3to5;SRMAPQ=61

更新:“SRMAPQ=60”可以在行中的任何位置, MAPQ=44;CT=3to5;SRMAPQ=61;DT=3to5

【问题讨论】:

  • 你用 awk 做了什么尝试,它是如何失败的?
  • @Inian 我不知道在 awk 中使用 > 或
  • 不知道你有没有SRMAPQ=6,这会导致你的方法失败。尝试使用method described here 提取值。然后将该值与您设置的最小值进行比较并打印。

标签: dataframe awk


【解决方案1】:

您不必单独从SRMAPQ 中提取值并进行比较。如果格式固定如上,只需使用=作为字段分隔符并使用$NF访问最后一个字段

awk -F= '$NF > 60' file

或者如果SRMAPQ 可以出现在行中的任何位置(如在 cmets 中更新),请使用通用方法

awk 'match($0, /SRMAPQ=([0-9]+)/){ l = length("SRMAPQ="); v = substr($0, RSTART+l, RLENGTH-l) } v > 60' file

【讨论】:

  • 谢谢,其实我还有一个问题。如果 SRMAP=60 不在末尾怎么办?我要求的数据框是一个简单的表格。 “1 3 MAPQ=0;CT=3to5;SRMAPQ=60;GT=100;DT=40”怎么样
  • awk 'match($0, /SRMAPQ=([0-9]+)/){ l = length("SRMAPQ="); v = substr($0, RSTART+l, RLENGTH-l) } int(v) > 60' 会更好。我尝试使用自己的数据,但没有 int(),也提取了 MAPQ=7 或 MAPQ=8。
  • @SGKwon 我在测试期间没有遇到此类问题。如果您在不同的输入上对此进行测试,请将其更新为问题
【解决方案2】:

我会按照下面的方式使用 GNU AWKfile.txt 内容成为

1  3  MAPQ=0;CT=3to5;SRMAPQ=60
2  34  MAPQ=60;CT=3to5;SRMAPQ=67;SOMETHING=2
4  56  MAPQ=67;CT=3to5;SRMAPQ=50
5  7  MAPQ=44;CT=3to5;SRMAPQ=61

然后

awk 'BEGIN{FS="SRMAPQ="}$2>60' file.txt

输出

2  34  MAPQ=60;CT=3to5;SRMAPQ=67;SOMETHING=2
5  7  MAPQ=44;CT=3to5;SRMAPQ=61

注意:添加了一些东西来测试当 SRMAPQ 不是最后一个时它是否可以工作。解释:我将FS 设置为SRMAPQ=,因此之前的内容成为第一个字段($1),后面的内容成为第二个字段($2)。在第二行这是67;SOMETHING=2,GNU AWK 通过转换它的最长前缀来应对,在这种情况下构成数字67,其他行只有数字。免责声明:此解决方案假定除最后一个字段之外的所有字段都有尾随 ;,如果这不成立,请在使用前全面测试我的解决方案。

(在 gawk 4.2.1 中测试)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多