您如何从文件中的列中 grep/awk?

Posted

技术标签:

【中文标题】您如何从文件中的列中 grep/awk?【英文标题】:How do you grep/awk from a column in a file? 【发布时间】:2022-01-20 11:53:42 【问题描述】:

我有一个名为 IDs_list.txt 的 ID 文件,我想使用该文件从第二个文件中提取信息,该文件有数百个 ID,其中许多不在我的特定 IDS_list.txt 中。

我尝试了 if 和 grep 的组合,但我的结果一直是空的。

这是我正在尝试做的事情以及我已经做过的事情的一个例子。

cat IDS_list.txt | head -n 4
24
43
56
69

cat sample1.txt | head -n 4
NODE_1_length_148512_cov_24.5066,gi|573017271|gb|CP006568.1|,148512,4513140,8,7289,86.545,0.0,13461,24,madeup species 1
NODE_2_length_122550_cov_25.719,gi|84778498|dbj|AP008232.1|,122550,4171146,13,12690,93.693,0.0,23435,244,madeup species 2
NODE_3_length_103385_cov_25.9802,gi|84778498|dbj|AP008232.1|,103385,4171146,6,4243,88.782,0.0,7836,43,madeup species 3
NODE_4_length_101672_cov_25.6536,gi|84778498|dbj|AP008232.1|,101672,4171146,7,4139,86.799,0.0,7644,955,long name here

ID 在第 10 列。

我需要删除IDS_list.txt 中ID 所在的所有行。

所以我的输出应该是:

NODE_1_length_148512_cov_24.5066,gi|573017271|gb|CP006568.1|,148512,4513140,8,7289,86.545,0.0,13461,24,madeup species 1
NODE_3_length_103385_cov_25.9802,gi|84778498|dbj|AP008232.1|,103385,4171146,6,4243,88.782,0.0,7836,43,madeup species 3

我试过了:

for file in sample?.txt; do awk 'FNR==NRarr[$0];next ($10 in arr)' IDs_list.txt $file; done

什么都没有出来。这个例子我取自另一个堆栈溢出问题。

for i in $(cat IDs_list.txt); do awk -F"," '$10 == $i' sample1.txt; done

但这会多次打印单个输出,因为我正在逐行迭代 IDs_list.txt,所以这不是我想要的。我可能会得到第一行输出数百次,因为我的 IDs_list.txt 有数百个 ID。

然后我用 awk 尝试了 grep,但也没有用。我的语法已关闭。

for file in sample?.txt; do for i in $(cat IDs_list.txt); do grep -w '$i' $file; done; done

这里没有输出。我的逻辑是,对于每个示例文件,我想 grep 包含在 IDs_list.txt 中找到的 ID 的行。但是我不喜欢不调用特定的第 10 列,因为 ID 有时会出现在其他实际上不是 ID 的列中。

在 for 循环中使用 grep 或 awk 或两者兼而有之的任何雄辩的方式?

【问题讨论】:

您引用 sample?.txt 这似乎表明您有多个示例文件...您需要将结果按输入文件分开还是要合并所有示例文件的结果成一组输出线?需要跟踪输入文件名吗?对最终输出进行排序呢? 他们需要分开。虽然输出应该已经排序,但排序也很好,因为示例文件是按节点名称排序的。 【参考方案1】:

你可以使用这个awk:

awk -F, 'NR==FNR ids[$1]; next $10 in ids' IDs_list.txt sample.txt

NODE_1_length_148512_cov_24.5066,gi|573017271|gb|CP006568.1|,148512,4513140,8,7289,86.545,0.0,13461,24,madeup species 1
NODE_3_length_103385_cov_25.9802,gi|84778498|dbj|AP008232.1|,103385,4171146,6,4243,88.782,0.0,7836,43,madeup species 3

【讨论】:

不错!我知道这类似于我的第一个命令,但我无法理解语法。对 awk 来说还是新手。这很好用,甚至不需要合并 grep。谢谢!

以上是关于您如何从文件中的列中 grep/awk?的主要内容,如果未能解决你的问题,请参考以下文章

如何从python中的CSV文件中的列中选择一个随机值?

如何从存储过程的表中的列中获取输出参数

如何从 BigQuery 的列中解析 JSON 文件

如何防止表格单元格(不是单个单元格)的列中的换行?

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

如何从熊猫数据框中的列中删除字符串值