我想从 中提取数字列表 ( string.txt
) masterFile.list
。masterFile.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 array
string
array
正如埃德·莫顿(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