일치하는 레코드를 얻기 위해 두 파일을 비교하는 방법은 무엇입니까?

일치하는 레코드를 얻기 위해 두 파일을 비교하는 방법은 무엇입니까?

각각 3,000개의 레코드가 포함된 2개의 구분된 파일이 있습니다 *.

서로 다른 위치에는 공통 필드가 있습니다. (count=1590) 에서는 file1position이 1이고, file2(2707)에서는 position이 2이다. file2 개수와 출력 개수는 동일해야 합니다. 참고: 파일 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

관련 정보