首页 > 解决方案 > 用 awk 实现类似 Excel-vlookup 的函数

问题描述

我有一个关于用 awk 实现 vlookup 函数的问题。我有一个 csv 文件,其中包含这样的 id-score 对(比如 1.csv):

id,score
1,16
3,12
5,13
11,8
13,32
17,37
23,74
29,7
31,70
41,83

有“未得分”的家伙。我还有一个 csv 文件,其中包括所有注册的人,都像这样得分和不得分(比如 2.csv)(我因空间不足而转置)

id,1,3,5,7,11,13,17,19,23,29,31,37,41

我想根据第二个 csv 文件生成 id-score 对,以便包括得分和不得分的人。对于没有得分的人,将使用 NAN 而不是数字。

换句话说,最终结果希望是这样的:

id,score
1,16
3,12
5,13
7,NAN
11,8
13,32
17,37
19,NAN
23,74
29,7
31,70
37,NAN
41,83

当我尝试使用以下awk命令创建一个新表时,它对我不起作用。提前感谢您的任何建议。

awk 'FNR==NR{a[$1]++; next} {print $0, (a[$1]) ? a[$2] : "NAN"}' 1.csv 2.csv

标签: excellinuxbashawkvlookup

解决方案


bashjoin:_

echo "id,score"
join --header -j 1 -t ',' <(sort 1.csv | grep -v '^id') <(tr ',' '\n' < 2.csv | grep -v '^id' | sort) -e "NAN" -a 2 -o 2.1,1.2 | sort -n

输出:

身份证,分数
1,16
3,12
5,13
7、南
11,8
13,32
17,37
19、南
23,74
29,7
31,70
37、南
41,83

看:man join


推荐阅读