如何仅取列中高于截止值的某些值

如何仅取列中高于截止值的某些值

我有一个包含 12 列的文件。在第 10 列中,我的值范围为 0-100。然而,我只需要那些高于 80 的值。剩下的,我想被过滤掉。我可以知道我应该使用哪个命令吗?

例子,

|Best_Hit_ARO|      |Best_Identities|
|------------|      |---------------|
|OXA-900     |      |      97.78    |
|qacJ        |      |      39.62    |
|adeF        |      |      67.78    |

因此,就像在这个例子中一样,如果 Best-identities 是我的第 10 列,我如何仅保留高于 80 的值,在本例中仅保留 97.78。

PS 这是一个 .tsv 文件,我希望将结果放入 new-file.tsv 中。我刚刚在这里创建了这个表格,以便大家可以轻松地进行可视化。否则,它是一个 tsv 文件

答案1

假设该文件以制表符分隔并包含问题中显示的标题:

$ cat file
Best_Hit_ARO    Best_Identities
OXA-900 97.78
qacJ    39.62
adeF    67.78

那么我们可以使用例如磨坊主( mlr) 过滤掉(提取)字段Best_Identities严格大于 80 的记录,如下所示:

$ mlr --tsv filter '$Best_Identities > 80' file
Best_Hit_ARO    Best_Identities
OXA-900 97.78

这使用filterMiller 操作来删除不满足给定条件的记录。

没有必要知道这Best_Identities是每个记录中的第二个(或第十个,或其他)字段,因为 Miller 知道每个字段的名称并允许我们通过名称访问它。

用于awk获取标题行和所有其他行(其第二个制表符分隔字段严格大于 80)可以按如下方式完成:

$ awk -F '\t' 'NR == 1 || $2 > 80' file
Best_Hit_ARO    Best_Identities
OXA-900 97.78

神秘的代码NR == 1 || $2 > 80是一个布尔测试,检查当前行是否是输入的第一行 ( NR == 1) 或者第二个字段中的值是否严格大于 80 ( $2 > 80)。如果测试是真的,输出当前记录。

更改$2为您的实际数据字段具有的任何索引。

如果您希望其中任何命令的输出进入新文件名,请使用 .redirect 将命令重定向到新文件名>some_new_name

您将问题标记为,但cut在这里使用是不可能的,因为该实用程序无法对值进行过滤,并且除非您选择剪切全部字段,将删除您可能想要保留的数据。

相关内容