美文网首页
awk 比较两个文件常用语法

awk 比较两个文件常用语法

作者: PETJO | 来源:发表于2021-01-06 16:17 被阅读0次

    1. 制作文件file1, file2, file3, file4, file5;"\t"分隔符;观察文件格式特点

    cat > file1
    aaa 001 A                                                                         
    bbb 002 B
    ccc 003 C
    ddd 004 D
    eee 005 E
    
    cat > file2
    aaa 001 A                                                                         
    bbb 002 B
    
    cat > file3
    aaa                                                                         
    bbb 
    ccc 
    ddd 
      
    cat file4
    aaa 001 100                                                                         
    bbb 002 90
    ccc 003 80
    ddd 004 70
    eee 005 60
    
    cat file5
    A   aaa 001 100                                                                       
    B   bbb 002 90
    C   ccc 003 80
    D   ddd 004 70
    E   eee 005 60
    

    2. awk是按行读入文件内容的,因此awk按行(字段)比较两个文件的相同行或者不同行

    # 1.同时在file1和file2中存在的行
    # 逻辑:当文件1时,将文件1按行写入数组;当文件2时,按行判断文件2是否在数组中,如果在,打印该行并输出到common文件。
    awk 'BEGIN{FS=OFS="\t"} {if(NR==FNR){array[$0]} else{if($0 in array) {print $0}}}' file1 file2 
    
    awk 'BEGIN{FS=OFS="\t"} {if(ARGIND==1){array[$0]} else{if($0 in array) {print $0}}}' file1 file2
    
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$0]} ARGIND==2{if($0 in array) {print $0}}' file1 file2
    
    # 2.只在一个文件中有的行
    # 逻辑:当文件1时,将文件1按行写入数组;当文件2时,按行判断文件2是否在数组中,如果在,删除数组中该条记录;打印数组中的值。
    awk 'BEGIN{FS=OFS="\t"} {if(NR==FNR){array[$0]} else{if($0 in array) {delete array[$0]}}} END{for(i in array) {print i}}' file1 file2
    
    awk 'BEGIN{FS=OFS="\t"} {if(ARGIND==1){array[$0]} else{if($0 in array) {delete array[$0]}}} END{for(i in array) {print i}}' file1 file2
    
    # 3.比较两个文件一列相同,打印目标行数据,注意构建数组的语法形式多样"++";"next"
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1]} ARGIND==2{if($1 in array){print $0}}' file3 file1
    
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1]++} ARGIND==2{if($1 in array){print $0}}' file3 file1
    
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1];next} ARGIND==2{if($1 in array){print $0}}' file3 file1
    
    # 4.比较两个文件(列数列号相同),指定多列相同时,打印目标数据
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1,$2];next} ($1,$2) in array' file1 file4
    
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{a[$1]; b[$2]; next} $1 in a && $2 in b' file1 file4
    
    # 5.比较两个文件(列数列号不相同),指定多列相同时,打印目标数据
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{a[$1]; b[$2]; next} $2 in a && $3 in b' file1 file5
    
    awk 'BEGIN{FS=OFS="\t"} ARGIND==1{array[$1,$2];next} ($2,$3) in array' file1 file5
    

    相关文章

      网友评论

          本文标题:awk 比较两个文件常用语法

          本文链接:https://www.haomeiwen.com/subject/czznoktx.html