比较两个文件并打印匹配值而不忽略重复项

比较两个文件并打印匹配值而不忽略重复项

我正在尝试比较两个文件并获取匹配的值。我尝试了这个命令:

grep -Fwf file_1.txt file_2.txt > matched_output.txt

然而,这个脚本仅提取唯一值

文件_1.txt

K00012 
K00012
K00024
K00024
K00024
K00027
K00027
K00027
K00027

文件_2.txt

ko:K00012 UGDH; UDP葡萄糖6-脱氢酶
ko:K00024 mdh;苹果酸脱氢酶
ko:K00027 ME2;苹果酸脱氢酶(草酰乙酸脱羧)

预期输出

K00012 ko:K00012 UGDH; UDP葡萄糖6-脱氢酶
K00012 ko:K00012 UGDH; UDP葡萄糖6-脱氢酶
K00024 ko:K00024 mdh;苹果酸脱氢酶
K00024 ko:K00024 MDH;苹果酸脱氢酶
K00024 ko:K00024 MDH;苹果酸脱氢酶
K00027 ko:K00027 ME2;苹果酸脱氢酶(草酰乙酸脱羧)
K00027 ko:K00027 ME2;苹果酸脱氢酶(草酰乙酸脱羧)
K00027 ko:K00027 ME2;苹果酸脱氢酶(草酰乙酸脱羧)
K00027 ko:K00027 ME2;苹果酸脱氢酶(草酰乙酸脱羧)

答案1

由于这些K??????值在第二个文件中是唯一的,您可以使用awk,首先读取第二个文件并将每一行保存到索引处的数组中K??????,然后处理第一个文件,并为K??????数组中的每个文件打印值和相应的行:

awk 'NR==FNR{split($1, a, ":"); u=a[2];b[u]=$0; next}
{if ($0 in b) {print $0, b[$0]}}' File2_.txt File1_.txt

或者,sed您可以将第二个文件转换为sed脚本并使用它来处理第一个文件:

sed 's|.*:\([^[:blank:]]*\)[[:blank:]].*|/\1/c\\\
\1 &|' File2_.txt | sed -f - File1_.txt

这假设第二个文件中只有一个:(在 后面ko)并且没有反斜杠,并且K??????不能包含斜杠。

答案2

while read line
do
    grep -q "$line" File_2.txt
    if [ "$?" -eq "0" ]; then
         echo -n "$line "
         grep "$line" File_2.txt
    fi
done < File_1.txt

请随意微调此脚本以获得更佳的结果

相关内容