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

时间:2015-08-20 13:03:54

标签: awk compare

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

INPUT:

File1中:

p1   555 
p1   557 
p3   558 

文件2:

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

输出:

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}' ?

2 个答案:

答案 0 :(得分:2)

试试这个单行:

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

答案 1 :(得分:1)

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

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

$ 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