我正在尝试根据两个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
我是脚本新手。有人可以指导我解决此问题。
答案 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