一致するレコードを取得するために2つのファイルを比較する方法は?

一致するレコードを取得するために2つのファイルを比較する方法は?

それぞれ3,000のレコードを含む2つの区切りファイルがあります*

異なる場所には共通フィールドがあります。 (count = 1590)ではfile1positionが1、file2(2707)ではpositionが2です。 file2の数と出力の数は同じでなければなりません。注:ファイル2の2番目の位置番号はファイル1に表示され、対応する$ 3の値(1または0)を取得する必要があります。

両方のファイルの合計数は3kで、両方のファイルは*で区切られています。 file1 $1 と file2 $2 は両方のファイルの共通フィールドなので、file1 $3 の途中で共通フィールドに 0 または 1 があることを確認する必要があります。次のファイルを作成する必要があります。 1==>000000001D0560020011 2==>000000003D0792917850、$ 1 = seqno、$ 2 = matched9digitの値の後にDが続き、$ 3は0または1です。

file2 の $2 値はすべて file1 の $1 値として表示されます。

ファイル1:

D056002001**1
D005356216**1
D079291785**0
D610350290**1

ファイル2:

000000001*D056002001
000000002*D610350290
000000003*D079291785

出力:

000000001*D056002001*1
000000002*D610350290*1
000000003*D079291785*0

次のコマンドを試してみましたawk

awk -F'*' 'NR==FNR{c[$1]++;next};c[$2]' file1 file2 > output
awk -F"*" '{ OFS="*"; if (NR==FNR) { a[$1+0]=$0;} else { if (a[$1+0]) { print $1, a[$2+0]}}}' file1 file2 > output
awk -F"*" '{ OFS="*"; if (NR==FNR) { a[$1+0]=$0;NEXT; } else { if (a[$2+0]) { print $0,a[$2+0]; } else { print $0,"***"; }}}' file1 file2 > output
awk -F"*" '{ OFS="*"; if (NR==FNR) {a[$1]=1; b[$1]=$2;next;} else { if ( a[$1]==1) { print $0,b[$1]} else { print $0,"0";}}}' file1 file2 > output

問題を解決するのに役立ちます。

答え1

awk 'BEGIN{FS=OFS="*"} NR==FNR{map[$1]=$3; next} {print $0, map[$2]}' file1 file2
000000001*D056002001*1
000000002*D610350290*1
000000003*D079291785*0

答え2

使用join:

join -t '*' -1 2 -2 1  <(sort -t'*' -k2 file2) <(sort file1) 

出力は少し異なりますが、ここから続けるのは簡単です。

D056002001*000000001**1
D079291785*000000003**0

すべてのラインを出力しますfile1

join -a 1 -t '*' -1 2 -2 1  <(sort -t'*' -k2 file2) <(sort file1)
D056002001*000000001**1
D079291785*000000003**0
D610350290*000000002

答え3

awk -F "*" 'NR==FNR{b[FNR]=$3;a[$1];next}($2 in a){print $0"*"b[FNR]}' file1 file2

出力

000000001*D056002001*1
000000002*D610350290*1
000000003*D079291785*0

関連情報