首页 > 解决方案 > 比较 csv 文件和提取列时输出 csv 的问题

问题描述

我正在尝试根据它们的第一个比较两个 csv 文件,并将文件 1 的前两列和文件 2 的第二列和第三列输出到新的 csv 文件

例子:

文件 1.csv

asdf123,1  
adfg234,2  
asdf567,3

文件2.csv

asdf123,q,w  
asdf567,r,t  

期望的输出

asdf123,1,q,w  
adfg234,2,NA  
asdf567,3,r,t 

我使用了以下代码

awk -F, 'FNR==NR{a[$1]=$0;next};{if (i in a) {print a[$1] "," $2} else {print a[$1] "," "NA"}}' file1.csv file2.csv > output.csv

但是,else 之后的命令似乎不起作用,并且该位置有空行,此外,输出打印如下(中间有新行):

asdf123,1  
*blank space* q,w  

asdf567,3  
*blank space* r,t

我是脚本新手。有人可以指导我解决这个问题。

标签: csvawk

解决方案


您的脚本中有几个错误:

$ awk -F, '
FNR==NR {
    a[$1]=$0
    next
}
{
    if($1 in a)              # no i anywhere, use $1
        print a[$1] "," $2 
    else 
        print $0 "," "NA"    # cant use a[$1] in this else 
}' file2 file1               # file order

现在输出:

asdf123,q,w,1
adfg234,2,NA
asdf567,r,t,3

而且它与您的输出不匹配,因为文件顺序已更改,无需更多努力:

$ awk '
BEGIN {
    FS=OFS=","
}
FNR==NR {
    key=$1                  # $0="1,2,3" key=1
    $1=""                   # $0=",2,3"
    a[key]=$0               # a[1]=",2,3"
    next
}
{
    if ($1 in a) 
        print $1,$2 a[$1]
    else 
        print $0,"NA"
}' file2 file1

这次输出:

asdf123,1,q,w
adfg234,2,NA
asdf567,3,r,t 

推荐阅读