比较CSV文件和提取列时输出CSV的问题

时间:2019-11-06 22:03:57

标签: csv awk

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

示例:

file1.csv

asdf123,1  
adfg234,2  
asdf567,3

file2.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

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

asdf123,1  
*blank space* q,w  

asdf567,3  
*blank space* r,t

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

2 个答案:

答案 0 :(得分:1)

您的脚本中有几个错误:

$ 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 

答案 1 :(得分:0)

使用bash进行排序和GNU连接:

join -t ',' -a 1 -e 'NA' <(sort file1.csv) <(sort file2.csv) -o 1.1,1.2,2.2,2.3

输出:

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

请参阅:man join