用awk实现类似excel中vlookup函数的功能

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

由于excel中的vlookup函数的效率实在是太低了,哥们我做数据处理的,忍受不了了。
所以自己用脚本开发一个类似的功能。
代码如下:

vlookup.sh内容
#!/bin/csh

if [ $# -lt 4 ];
then
    echo "argument size < 4"
    echo "USEAGE sh vlookup.sh source.csv pattern.csv pattern_col output_col default_value"
    exit 0
fi

SOURCE_FILE=$1
PATTERN_FILE=$2
PATTERN_INDEX=$3
INSERT_INDEX=$4
DEFAULT_VALUE=$5

awk -v PATTERN_FILE=${PATTERN_FILE} -v PATTERN_INDEX=${PATTERN_INDEX} -v INSERT_INDEX=${INSERT_INDEX} -v DEFAULT_VALUE=${DEFAULT_VALUE} -F ',' -f vlookup.awk  ${SOURCE_FILE}




vlookup.awk文件内容:
#!/bin/awk -f
# 模仿excel中的vlookup函数的功能
# awk -v PATTERN_FILE=${PATTERN_FILE} -v PATTERN_INDEX=${PATTERN_INDEX} -v INSERT_INDEX=${INSERT_INDEX} -f vlookup.awk  ${SOURCE_FILE}

# 初始化
BEGIN{
    # 加载匹配文件
    while(getline < PATTERN_FILE){
        len=split($0 , pattern , ",") ;
        matcher = pattern[2] ;
        gsub(/\r/, "" , matcher) ;
        map[pattern[1]] = matcher ;
    }
    close(PATTERN_FILE) ;
}

# 行处理
{
    # 空行不进行处理
    if(NF == 0){
        next;
    }
    # 不处理第一行
    if(NR == 1){
       next ;
    }
    format = "" ;
    for(i = 1 ; i <= NF + 1 ; i ++){
        # 匹配到的行
        if(i == INSERT_INDEX){
            if($(PATTERN_INDEX) in map){
                format = format "" (map[$(PATTERN_INDEX)] "" ",") ;
            }else{
                format = format "" DEFAULT_VALUE "" ",";
            }
        }else{
            if(i < INSERT_INDEX){       # 直接输出的行
                gsub(/\r/, "", $i) ;
                format = format "" ($i "" ",") ;
            }else{              # 匹配的行的右边的列都向右移动
                gsub(/\r/, "", $(i-1)) ;
                format = format "" ($(i-1) "" ",") ;
            }
        }
    }
    printf("%s\n" , substr(format , 1 , length(format) - 1)) ;
}

#后处理
{
}


示例:
sh vlookup.sh area.csv pattern.csv 1 2 default_value

area.csv内容如下:
bianhongfei,10,hahaha,hahahah
bianhongfei,11,hahaha,hahahah
bianhongfei,12,hahaha,hahahah
bianhongfei,13,hahaha,hahahah
bianhongfei,14,hahaha,hahahah
bianhongfei,15,hahaha,hahahah
bianhongfei,16,hahaha,hahahah
bianhongfei,17,hahaha,hahahah
bianhongfei,18,hahaha,hahahah
bianhongfei,19,hahaha,hahahah
bianhongfei,20,hahaha,hahahah
bianhongfei,21,hahaha,hahahah
bianhongfei,22,hahaha,hahahah
bianhongfei,23,hahaha,hahahah
bianhongfei,24,hahaha,hahahah
bianhongfei,25,hahaha,hahahah
bianhongfei,26,hahaha,hahahah
bianhongfei,27,hahaha,hahahah
bianhongfei,28,hahaha,hahahah
bianhongfei,29,hahaha,hahahah
bianhongfei,30,hahaha,hahahah
bianhongfei,31,hahaha,hahahah
bianhongfei,32,hahaha,hahahah
bianhongfei,33,hahaha,hahahah
bianhongfei,34,hahaha,hahahah
bianhongfei,35,hahaha,hahahah
bianhongfei,36,hahaha,hahahah
bianhongfei,37,hahaha,hahahah
bianhongfei,38,hahaha,hahahah
bianhongfei,39,hahaha,hahahah
bianhongfei,40,hahaha,hahahah
bianhongfei,41,hahaha,hahahah
bianhongfei,42,hahaha,hahahah

pattern.csv的内容如下:
10,北京市
11,天津市
12,河北省
13,山西省
14,内蒙古自治区
15,辽宁省
16,吉林省
17,黑龙江省
18,上海市
19,江苏省
20,浙江省
21,安徽省
22,福建省
23,江西省
24,山东省
25,河南省
26,湖北省
27,湖南省
28,广东省
29,广西壮族自治区
30,海南省
31,重庆市
32,四川省
33,贵州省
34,云南省
35,西藏自治区
36,陕西省
37,甘肃省
38,青海省
39,宁夏回族自治区
40,新疆维吾尔自治区
41,港澳地区

参数:1,匹配第一列,2,输出在第二列



最终输出:
10,北京市,hahaha,hahahah
11,天津市,hahaha,hahahah
12,河北省,hahaha,hahahah
13,山西省,hahaha,hahahah
14,内蒙古自治区,hahaha,hahahah
15,辽宁省,hahaha,hahahah
16,吉林省,hahaha,hahahah
17,黑龙江省,hahaha,hahahah
18,上海市,hahaha,hahahah
19,江苏省,hahaha,hahahah
20,浙江省,hahaha,hahahah
21,安徽省,hahaha,hahahah
22,福建省,hahaha,hahahah
23,江西省,hahaha,hahahah
24,山东省,hahaha,hahahah
25,河南省,hahaha,hahahah
26,湖北省,hahaha,hahahah
27,湖南省,hahaha,hahahah
28,广东省,hahaha,hahahah
29,广西壮族自治区,hahaha,hahahah
30,海南省,hahaha,hahahah
31,重庆市,hahaha,hahahah
32,四川省,hahaha,hahahah
33,贵州省,hahaha,hahahah
34,云南省,hahaha,hahahah
35,西藏自治区,hahaha,hahahah
36,陕西省,hahaha,hahahah
37,甘肃省,hahaha,hahahah
38,青海省,hahaha,hahahah
39,宁夏回族自治区,hahaha,hahahah
40,新疆维吾尔自治区,hahaha,hahahah
41,港澳地区,hahaha,hahahah
42,default,hahaha,hahahah