仅从第一列从文件中提取字符串列表

仅从第一列从文件中提取字符串列表

我想从 中提取数字列表 ( string.txt) masterFile.listmasterFile.list由多个列分隔|并包含多个列。我只对该行感兴趣,其中第一列包含文件中匹配的数字string.txt

字符串.txt:

3075
3078
3076

masterFile.list

3078    |       Auxenochlorella pyrenoidosa (H.Chick) Molinari & Calvo-Perez, 2015      |                   |       authority       |
3079    |       Auxenochlorella pyrenoidosa 3078    |               |       scientific name |
3076    |       Chlorella pyrenoidosa H.Chick, 1903     |               |       authority       |
3077    |       Chlorella vulgaris var. viridis Chodat, 1913    |               |       authority
487     |       ATCC 13077      |       ATCC 13077 <type strain>        |       type material   |
460     |       DSM 23076       |       DSM 23076 <type strain> |       type material   |

预期输出:

3078    |       Auxenochlorella pyrenoidosa (H.Chick) Molinari & Calvo-Perez, 2015      |                       |       authority       |
3076    |       Chlorella pyrenoidosa H.Chick, 1903     |               |       authority       |

我发现之前的大多数帖子只允许提取单个字符串,并将匹配限制为第一列。是否可以一次提取多个字符串?

答案1

您可以使用以下awk程序:

awk -F' *|' 'NR==FNR{searchstr[$1]=1} NR>FNR && ($1 in searchstr) {print}' string.txt masterFile.list

如您所见,您将这两个文件作为参数提供给awk.

  • 当处理第一个文件时(由 表示FNR,每个文件行计数器,等于NR,全局行计数器),我们只需注册所有搜索字符串(每行的字段 nr.1,因为它们是唯一的项目)在一个数组中searchstr(但是,以一个数组索引,所以“值”只是1) 的虚拟值。

  • 当我们来到第二个文件(NR现在大于FNR)时,我们检查第一列($1)时,我们检查是否包含作为数组索引searchstr。如果是这样,我们打印整行。

这背后的想法是awk有一个方便的语法,如果位于 的数组索引列表中,则该语法为 true 。string in arraystringarray

正如埃德·莫顿(Ed Morton)所指出的,你可以将其“打高尔夫球”成

awk -F' *|' 'NR==FNR{searchstr[$1]; next} $1 in searchstr' string.txt masterFile.list

searchstr[$1]调用将定义(但不填充)该数组条目,并且$1 in searchstr 外部规则块的 - 如果评估为true- 指示awk打印当前行。next处理规则中的指令将string.txt确保仅达到该部分masterFile.list

请注意,我指定了完整的正则表达式(*|,即任意数量的空格,后跟|)作为字段分隔符,以确保 的“第一个字段”masterFile.list确实只是数字 - 指定-F'|'意味着也包含尾随空格,并且会使匹配过程更加复杂。如果“空格”实际上也可以包含制表符,请-F'[[:space:]]*|'改为使用。

答案2

正如其他人指出的那样,有多种选择。

for i in $(cat string.txt); do grep -E "(^$i)" masterFile.txt; done

答案3

这应该适合你

cat string.txt| while read -r str; do egrep "^$str *\|" masterFile.list;done

相关内容