我有一个包含 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
这使用filter
Miller 操作来删除不满足给定条件的记录。
没有必要知道这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
在这里使用是不可能的,因为该实用程序无法对值进行过滤,并且除非您选择剪切全部字段,将删除您可能想要保留的数据。