比较两个文件,如果匹配,只有最后两个字段将下移(awk)

比较两个文件,如果匹配,只有最后两个字段将下移(awk),awk,compare,Awk,Compare,我有两个输入文件(以制表符分隔),如果只匹配第3和第4个字段将下移,我需要为$1&&$2查找它们之间的匹配: 输入: 文件1: 文件2: 输出: p1 323 lololo aaaa p1 555 papaapp kkka p1 556 hooho sssa p1 557 jjjlo kkka etc. 我想比较一下: awk -F'\t' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file

我有两个输入文件(以制表符分隔),如果只匹配第3和第4个字段将下移,我需要为$1&&$2查找它们之间的匹配:

输入:

文件1: 文件2: 输出:

p1 323  lololo aaaa
p1 555
          papaapp kkka
p1 556   hooho   sssa
p1 557   
          jjjlo kkka
 etc.   
我想比较一下:

awk -F'\t' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2
但我不知道如何为它创造条件:

awk '{if ($1$2file1 == $1$2file2) print $1$2"\n"$3$4; else print $0}' ?

中的
操作符将告诉您是否在file1中看到file2中的
$1$2
值。这比检查
c[$1$2]>0
有一个优势,因为后者实际上会为
$1$2
创建一个条目,即使它以前不存在(其值相当于
0
,因此仍然有效,但我们不需要在
中使用
来创建它来避免这种副作用)

编辑:在数组索引中使用逗号分隔符,以便在
$1
$2
之间插入子集值,从而避免注释中正确指出的问题

$ cat tf.awk
BEGIN {FS=OFS="\t"}
NR==FNR {c[$1,$2]; next}
{if (($1,$2) in c) print $1,$2 RS OFS OFS $3, $4; else print}

$ awk -f tf.awk file1 file2
p1  323 lololo  aaaa
p1  555
        papapp  kkka
p1  556 hooho   sssa
p1  557
        jjjlo   kkka
p3  424 zzzzz   llla
p3  558
        jjjjj   ssss

中的
操作符将告诉您是否在file1中看到file2中的
$1$2
值。这比检查
c[$1$2]>0
有一个优势,因为后者实际上会为
$1$2
创建一个条目,即使它以前不存在(其值相当于
0
,因此仍然有效,但我们不需要在
中使用
来创建它来避免这种副作用)

编辑:在数组索引中使用逗号分隔符,以便在
$1
$2
之间插入子集值,从而避免注释中正确指出的问题

$ cat tf.awk
BEGIN {FS=OFS="\t"}
NR==FNR {c[$1,$2]; next}
{if (($1,$2) in c) print $1,$2 RS OFS OFS $3, $4; else print}

$ awk -f tf.awk file1 file2
p1  323 lololo  aaaa
p1  555
        papapp  kkka
p1  556 hooho   sssa
p1  557
        jjjlo   kkka
p3  424 zzzzz   llla
p3  558
        jjjjj   ssss

中的
操作符将告诉您是否在file1中看到file2中的
$1$2
值。这比检查
c[$1$2]>0
有一个优势,因为后者实际上会为
$1$2
创建一个条目,即使它以前不存在(其值相当于
0
,因此仍然有效,但我们不需要在
中使用
来创建它来避免这种副作用)

编辑:在数组索引中使用逗号分隔符,以便在
$1
$2
之间插入子集值,从而避免注释中正确指出的问题

$ cat tf.awk
BEGIN {FS=OFS="\t"}
NR==FNR {c[$1,$2]; next}
{if (($1,$2) in c) print $1,$2 RS OFS OFS $3, $4; else print}

$ awk -f tf.awk file1 file2
p1  323 lololo  aaaa
p1  555
        papapp  kkka
p1  556 hooho   sssa
p1  557
        jjjlo   kkka
p3  424 zzzzz   llla
p3  558
        jjjjj   ssss

中的
操作符将告诉您是否在file1中看到file2中的
$1$2
值。这比检查
c[$1$2]>0
有一个优势,因为后者实际上会为
$1$2
创建一个条目,即使它以前不存在(其值相当于
0
,因此仍然有效,但我们不需要在
中使用
来创建它来避免这种副作用)

编辑:在数组索引中使用逗号分隔符,以便在
$1
$2
之间插入子集值,从而避免注释中正确指出的问题

$ cat tf.awk
BEGIN {FS=OFS="\t"}
NR==FNR {c[$1,$2]; next}
{if (($1,$2) in c) print $1,$2 RS OFS OFS $3, $4; else print}

$ awk -f tf.awk file1 file2
p1  323 lololo  aaaa
p1  555
        papapp  kkka
p1  556 hooho   sssa
p1  557
        jjjlo   kkka
p3  424 zzzzz   llla
p3  558
        jjjjj   ssss

试试这一行:

awk -F'\t' 'NR==FNR{a[$0];next}
           {k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' file1 file2
使用您的数据:

kent$  head f1 f2
==> f1 <==
p1      555
p1      557
p3      558

==> f2 <==
p1      323     lololo  aaaa
p1      555     papapp  kkka
p1      556     hooho   sssa
p1      557     jjjlo   kkka
p3      424     zzzzz   llla
p3      558     jjjjj   ssss

kent$  awk -F'\t' 'NR==FNR{a[$0];next}{k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' f1 f2   
p1      323     lololo  aaaa
p1      555
                 papapp kkka
p1      556     hooho   sssa
p1      557
                 jjjlo kkka
p3      424     zzzzz   llla
p3      558
                 jjjjj ssss
kent$head f1 f2

==>f1 f2试试这一行:

awk -F'\t' 'NR==FNR{a[$0];next}
           {k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' file1 file2
使用您的数据:

kent$  head f1 f2
==> f1 <==
p1      555
p1      557
p3      558

==> f2 <==
p1      323     lololo  aaaa
p1      555     papapp  kkka
p1      556     hooho   sssa
p1      557     jjjlo   kkka
p3      424     zzzzz   llla
p3      558     jjjjj   ssss

kent$  awk -F'\t' 'NR==FNR{a[$0];next}{k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' f1 f2   
p1      323     lololo  aaaa
p1      555
                 papapp kkka
p1      556     hooho   sssa
p1      557
                 jjjlo kkka
p3      424     zzzzz   llla
p3      558
                 jjjjj ssss
kent$head f1 f2

==>f1 f2试试这一行:

awk -F'\t' 'NR==FNR{a[$0];next}
           {k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' file1 file2
使用您的数据:

kent$  head f1 f2
==> f1 <==
p1      555
p1      557
p3      558

==> f2 <==
p1      323     lololo  aaaa
p1      555     papapp  kkka
p1      556     hooho   sssa
p1      557     jjjlo   kkka
p3      424     zzzzz   llla
p3      558     jjjjj   ssss

kent$  awk -F'\t' 'NR==FNR{a[$0];next}{k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' f1 f2   
p1      323     lololo  aaaa
p1      555
                 papapp kkka
p1      556     hooho   sssa
p1      557
                 jjjlo kkka
p3      424     zzzzz   llla
p3      558
                 jjjjj ssss
kent$head f1 f2

==>f1 f2试试这一行:

awk -F'\t' 'NR==FNR{a[$0];next}
           {k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' file1 file2
使用您的数据:

kent$  head f1 f2
==> f1 <==
p1      555
p1      557
p3      558

==> f2 <==
p1      323     lololo  aaaa
p1      555     papapp  kkka
p1      556     hooho   sssa
p1      557     jjjlo   kkka
p3      424     zzzzz   llla
p3      558     jjjjj   ssss

kent$  awk -F'\t' 'NR==FNR{a[$0];next}{k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' f1 f2   
p1      323     lololo  aaaa
p1      555
                 papapp kkka
p1      556     hooho   sssa
p1      557
                 jjjlo kkka
p3      424     zzzzz   llla
p3      558
                 jjjjj ssss
kent$head f1 f2


==>f1 f2
a[$1$2]
不安全。想想
p112
p112
。谢谢,@Kent,yikes,完全正确。编辑为使用
子页面
a[$1$2]
不安全。想想
p112
p112
。谢谢,@Kent,yikes,完全正确。编辑为使用
子页面
a[$1$2]
不安全。想想
p112
p112
。谢谢,@Kent,yikes,完全正确。编辑为使用
子页面
a[$1$2]
不安全。想想
p112
p112
。谢谢,@Kent,yikes,完全正确。编辑为使用
子页面
。如果我还有其他问题(希望问题简单…)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法阅读…我添加了它..我不想重复类似的问题,但是的,你是对的..如果我有其他问题(我希望问题简单..)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法阅读…我添加了它..我不想重复类似的问题,但是的,你是对的..如果我有其他问题(我希望问题简单..)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法阅读…我添加了它..我不想重复类似的问题,但是的,你是对的..如果我有其他问题(我希望问题简单..)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法读取…我添加了它..我不想重复类似的问题,但是的,你是对的。。