如何比较两个文件以获得匹配的记录?

如何比较两个文件以获得匹配的记录?

我有 2 个带分隔符的文件*,每个文件有 3k 条记录。

不同的位置都有共同的字段。在file1(count=1590) 中,位置为 1,在file2(2707) 中,位置为 2。 file2 计数和输出计数应该相同。注意:在文件 2 中,第二个位置数字将出现在文件 1 中,我们需要采用相应的 $3 值,即 1 或 0

在这两个文件中,总计数都是 3k,两个文件都是 * 分隔符,因为 file1 $1 和 file2 $2 是两个文件的公共字段,我们需要检查公共字段是否有 0 或 1 存在于 file1 $3 中。我们需要写这样的文件 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

相关内容