각각 3,000개의 레코드가 포함된 2개의 구분된 파일이 있습니다 *
.
서로 다른 위치에는 공통 필드가 있습니다. (count=1590) 에서는 file1
position이 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