我想根据文件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
}
}
}