我有一份数据文件 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