我想根据文件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吗?答案 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
}
}
}