awk:根据file2打印文件1,并从文件2中添加列,并根据匹配的列丢弃文件1中的行

时间:2017-02-15 17:42:30

标签: 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行,则打印出file1的第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,然后,我将打印出该行,并在第4列中添加“na”。

所以,最终输出应该是这样的:

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上搜索解决方案多次修改此代码,但从未解决过。

非常感谢您的帮助!

顺便说一下,这种工作是不是很难用awk?在这种情况下我应该试试Python吗?

1 个答案:

答案 0 :(得分:1)

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}将第3列保存为数组值,将$ 1 $ 2保存为第一个输入文件的键。
  • ($1$2 in a){print $0, a[$1$2]}检查第二个输入$ 1 $ 2,如果它存在于数组中,则打印第二个输入文件的整行和数组值。

  • !($1$2 in a){if($3>15){print $0, " na"}}如果不在数组中,第3列大于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
      }
    }
}