我正在尝试比较两个文件并获取匹配的值。我尝试了这个命令:
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
请随意微调此脚本以获得更佳的结果