linux - 如何使用 grep 精确匹配单词

标签 linux bash zsh

我在 zsh 中有一个列表/数组,它是 house=$(cat Corrected_inhouse_list.txt)

包含:

N-METHYL-L-GLUTAMIC ACID
L-GLUTAMIC ACID
CREATINE
L-PROLINE
CREATINE PHOSPHATE
L-VALINE
L-TYROSINE
L-KYNURENINE
L-PHENYLALANINE
PHENYLETHANOLAMINE
D-PANTOTHENIC ACID
L-TRYPTOPHAN
MYRISTIC ACID

文件“metexplore_IDs_DB.tsv”:

8:M_Lkynr   exact multimatching 1   L-KYNURENINE    CHEBI:16946 NA  NA
21:M_glu_L  exact multimatching 1   L-GLUTAMIC ACID CHEBI:16015 NA  NA
40:M_trp_L  exact multimatching 1   L-TRYPTOPHAN    CHEBI:16828 NA  NA
42:M_pro_L  exact multimatching 1   L-PROLINE   CHEBI:17203 NA  NA
50:M_phe_L  exact multimatching 1   L-PHENYLALANINE CHEBI:17295 NA  NA
56:M_creat  exact multimatching 1   CREATINE    CHEBI:16919 NA  NA
57:M_34dhphe    exact multimatching 1   3,4-DIHYDROXY-L-PHENYLALANINE (L-DOPA)  CHEBI:15765 NA  NA
61:M_tyr_L  exact multimatching 1   L-TYROSINE  CHEBI:17895 NA  NA
63:M_val_L  exact multimatching 1   L-VALINE    CHEBI:16414 NA  NA
94:M_Lkynr  exact multimatching 1   L-KYNURENINE    CHEBI:16946 NA  NA
95:M_5oxpro exact multimatching 1   5-OXO-L-PROLINE CHEBI:18183 NA  NA
107:M_4hpro_LT  exact multimatching 1   4-HYDROXY-L-PROLINE CHEBI:18095 NANA
171:M_pcreat    exact multimatching 1   PHOSPHOCREATINE CHEBI:17287 NA  NA
191:M_pnto_R    exact multimatching 1   D-PANTOTHENIC ACID  CHEBI:7916  NANA
211:M_pcreat    exact multimatching 1   CREATINE PHOSPHATE  CHEBI:17287 NANA
237:M_35diotyr  exact multimatching 1   3,5-DIIODO-L-TYROSINE   CHEBI:15768 NANA
315:M_ttdca exact multimatching 1   MYRISTIC ACID   CHEBI:28875

我想使用 grep 来匹配文件上的这个单词。问题是人们可以在图片中看到什么,grep 还捕获包含但不以我感兴趣的单词开头的单词。

我已经尝试过:

for i in ${house[*]}; do grep -n -E "^\s*\{$i}\>" metexplore_IDs_DB.tsv; done
for i in ${house[*]}; do grep -n -E -w "\<$i" metexplore_IDs_DB.tsv; done 
for i in ${house[*]}; do grep -n -E "(^|\t)$i" metexplore_IDs_DB.tsv; done

enter image description here

我可以做什么来实现我的目标?所需的输出将没有第 57、95、107 和 237 行。

最佳答案

看起来您总是匹配字段 4。因此 awk 将是一个更好的解决方案,因为您可以简单地与整个字段进行精确匹配:

for i in "${house[@]}"; do
    awk -F'\t' -v i="$i" '$4 == i' metexplore_ID.tsv
done

不要忘记 ${house[@]} 周围的引号;否则像 L-GLUTAMIC ACID 这样的元素将被视为两个不同的单词来匹配。

您还可以通过将 Corrected_inhouse_list.txt 直接加载到 awk 数组中来避免创建数组和循环:

awk -F'\t' -v i="$i" '
    NR == FNR {houses[$0]++; next} 
    $4 in houses' corrected_inhouse_list.txt metexplore_ID.tsv

关于linux - 如何使用 grep 精确匹配单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70293298/

相关文章:

bash - 循环遍历未知数量的具有渐进名称的文件夹

linux - Bash 打印重复破折号字符不适用于我的 printf

shell - sed Capital_Case 不工作

go - exec:“firefox”:在$ PATH中找不到可执行文件

c - 从 C++ 应用程序中确定最后一个背景 pid

linux - 使用 sed 提取子表达式

linux - 使用命令行在启动后捕获进程的 STDIN/STDERR/STDOUT?

zsh:vcs_info: 分支格式的分支名称

linux - 在 bash 中迭代数据文件

c++ - “id”系统调用通过选项 “stream_id”返回的结构中的 “PERF_RECORD_SAMPLE”和 “perf_event_open”有什么区别?