查找并打印具有其名称的特定信息

查找并打印具有其名称的特定信息

我有一份数据文件 1 的列表,我想在文件 2 中查找它,并希望在其中使用其名称 grep 匹配模式。每个名称不一定都包含唯一数据。名称之间可能很常见。 

文件 1:

123_A7
456_B2
789_f5
111_L2

主文件:

A   Edwin
B   777
B   123_A7
B   456_B2
A   Alex
B   453
B   678
A   Marwin
B   789
B   123_A7
B   111_L2
B   452

期望输出:

B   123_A7
A   Edwin
A   Marwin
B   456_B2
A   Edwin
B   111_L2
A   Marwin

答案1

您可以使用sed

sed '/\s/{H;d;}
  G;s/\nB/#B/g
  s/^\(.*\)\(\n\n.*#\)\(B\s*\1\)/\3#\2\3/
  /^[^#]*\n/d
  :a;s/^\([^#]*\)\(#.*\n\)\(A[^#]*\)\([^\n]*#\)\1/\1#\3\2/;ta
  s/#\n.*//;y/#/\n/' main file1

首先读取main文件以收集保留空间中每个名称的代码(第 1 行)。然后,对于file1附加保留空间的每一行,用 替换B行前的换行符以便#于解析(第 2 行),并使用反向引用搜索匹配的代码(第 3 行)。删除没有匹配的行(第 4 行)。现在循环收集给定模式的名称(第 5 行)。最后打印,删除剩余的保留空间并将其#转换回换行符(第 6 行)。(注意:仅适用于 GNU sed

答案2

我会用awk这个:

awk 'NR==FNR{seen[$1];next} /^A/{NAME=$0}
    {for (x in seen){ if ($2==x)print $0"\n"NAME}}' file1 main

输出为:

B   123_A7
A   Edwin
B   456_B2
A   Edwin
B   123_A7
A   Marwin
B   111_L2
A   Marwin

上面是打印 ID 和名称(如果继承自该 ID,但分开)。以下是将名称分组到相同 ID 中的完整脚本。

awk -F'\t' '{a[$1]=a[$1]"\n"$2} END{for (i in a) print i""a[i]}' <(
    awk 'NR==FNR{seen[$1];next} 
        /^A/{NAME=$0}{for (x in seen){ if ($2==x)print $0"\t"NAME}
    }' file1 main)

输出为:

B   111_L2
A   Marwin
B   456_B2
A   Edwin
B   123_A7
A   Edwin
A   Marwin

相关内容