重複を無視せずに2つのファイルを比較し、一致する値を印刷します。

重複を無視せずに2つのファイルを比較し、一致する値を印刷します。

2つのファイルを比較して一致する値を取得しようとしています。私は次のコマンドを試しました。

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

しかし、このスクリプトは一意の値のみを抽出

File_1.txt

K00012 
K00012
K00024
K00024
K00024
K00027
K00027
K00027
K00027

File_2.txt

ja:K00012 UGDH; UDPグルコース6-脱水素酵素
ja:K00024 mdh;リンゴ酸脱水素酵素
ja:K00027 ME2;

期待される出力

K00012 ja:K00012 UGDH; UDPグルコース6-脱水素酵素
K00012 ja:K00012 UGDH; UDPグルコース6-脱水素酵素
K00024 ja:K00024 mdh;マレート
脱水素酵素
K00024 MDH; DH;マレート脱水素酵素
K00027 ja:K00027 ME2;マレート脱水素酵素(
オキサロアセテートの脱カルボキシル化)K00027 ja:K00027 ME2。マレート脱水素酵素(オキサロアセテートの脱カルボキシル化)K00027 ja:K00027 ME2。
アロ酢酸の脱カルボキシル化)

答え1

K??????は2番目のファイルで一意であるため、を使用できます。awkまず、2番目のファイルを読み取り、各行をindexの配列に保存し、最初のファイルを処理し、配列内の各ファイルの値とその行を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

または、sed2番目のファイルをsedスクリプトに変換し、それを使用して最初のファイルを処理することもできます。

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

これは、2番目のファイルに:(最後に)1つだけがあり、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

より良い結果を得るには、このスクリプトを自由に調整してください。

関連情報