尴尬:基于File2打印文件1,并在文件2中添加列,并根据匹配的列在文件1中丢弃行

  • 本文关键字:文件 基于 File2 打印 添加 尴尬 awk
  • 更新时间 :
  • 英文 :


我想根据文件2打印文件1。这是工作详细信息:

第一个CSV文件,称为" file1_ab.csv":

a,  b,  20  
a1, b1, 5  
a2, b2, 8  
a5, b5, 30  

第二个CSV文件,称为" file2_ab_compare.csv":

a,  b,  ID_100  
a4, b4, ID_400  
a2, b2, ID_200  

我想将第二个CSV文件用作过滤器,以有条件地打印出第一个CSV文件,按照这样的逻辑:

1)。如果文件1的$ 1 $ 2与该文件2相同,例如File1的第1行,请打印出文件1的第1行加文件2的$ 3(形成第4列)。例如:

a, b, 20, ID_100 

2)。如果文件1的$ 1 $ 2在文件2中不存在,我想根据其$ 3的值选择性地打印出文件1的行。

例如:

文件1(5)的第2行的$ 3小于15,然后,我将丢弃此行。(因此,第2行:A1,B1,5不在输出文件中)。

另一方面,

文件1(30)第4行的$ 3大于15,然后,我将打印出此行,然后将" NA"放在第4列中。

因此,最终输出应该是这样的:

a,  b,  20, ID_100  
a2, b2, 8,  ID_200  
a5, b5, 30, na 

我写了这样的代码,称为" filter.awk":

#!/usr/bin/awk -f
BEGIN {FS=","}
NR==FNR{a[$1$2]=$3;next}
{
if ($1$2 in a) print $0","a[$1$2];
else
    if {$3 > 15} print $0",""na";}
    else {next}
}

我运行此代码,例如:

awk -f filter.awk file2_ab_compare.csv file1_ab.csv

,但它说存在语法错误。我试图通过在Stackoverflow上搜索解决方案来多次修改此代码,但从未解决过。

我非常感谢您的帮助!

顺便说一句,这种工作难以使用尴尬吗?如果这样,我应该尝试python吗?

awk -F, 'BEGIN{OFS=","} NR==FNR{a[$1$2]=$3;next} ($1$2 in a){print $0, a[$1$2]} !($1$2 in a){if($3>15){print $0, " na"}}' file2_ab_compare.csv file1_ab.csv
  • BEGIN{OFS=","}将输出字段分隔符设置为逗号。
  • NR==FNR{a[$1$2]=$3;next}将第三列作为数组值保存,而$ 1 $ 2作为第一个输入文件的密钥。
  • ($1$2 in a){print $0, a[$1$2]}检查第二输入$ 1 $ 2,如果它存在于数组中,则打印第二个输入文件和数组值的整行。

  • !($1$2 in a){if($3>15){print $0, " na"}}如果不在数组中,第三列大于15,打印整个行并附加na

输出:

a, b, 20, ID_100
a2, b2, 8, ID_200
a5, b5, 30, na

在您的代码中,您不匹配和滥用卷曲括号,更正的脚本为:

#!/usr/bin/awk -f
BEGIN {FS=","}
NR==FNR{a[$1$2]=$3;next}
{
    if ($1$2 in a){
      print $0","a[$1$2];
    }else{
      if ($3 > 15){
         print $0",""na";
      }else{
        next
      }
    }
}

最新更新