比较csv文件中的2列以上,并在csv文件中创建新列

时间:2018-01-15 11:21:37

标签: shell unix awk

我有2个csv文件(1.csv和2.csv)。两个文件中的列数相同。

1.csv

Server,Path,I/P Backlog,O/P Backlog
Server1,Yes,3000,200
Server3,Yes,8,0
Server5,Yes,0,0


2.csv

Server,Path,I/P Backlog,O/P Backlog
Server1,Yes,3300,180
Server3,Yes,7,0
Server5,Yes,0,0
Server6,Yes,10,200

我必须在两个csv中比较3个不同的列。

在上面的示例中,如果服务器名称相同,则找到I / P积压和o / p积压的偏差百分比,并为输入趋势和输出趋势创建2个单独的列。

如果值相同:Nochange。 如果价值增加那么它应该增加%(向上) 如果价值下降:减少%(下) 如果添加了新行:新建 如果第二个报告中不存在任何行,则无需执行任何操作。

所以我的最后一张表应如下所示。

Server  Path    I/P Backlog Input Trend O/P Backlog Output Trend
Server1 Yes 3300    10%(up) 180 20%(down)
Server3 Yes 7   20%(down)   0   No change
Server5 Yes 0   No change   0   No change
Server6 Yes 10  New 200 New

1 个答案:

答案 0 :(得分:1)

扩展 @PostMapping("/post") public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) 解决方案:

awk

输出:

awk 'function percent(v){ 
         if (v !~ /^[0-9]+(\.[0-9]+)?$/){ return v } 
         coef=1; dev="down"; 
         if (v >= 1){ coef=-1; dev="up" } 
         return sprintf("%d%(%s)",(100-v*100) * coef, dev) 
    }
    NR==1{ 
        $4=$4 FS "Input Trend"; 
        $6=$6 FS "Output Trend"; 
        print 
    }
    FNR==1{ next }{ k=$1 FS $2 }
    NR==FNR{ a[k]=$3 FS $4; next }
    k in a{ 
        split(a[k], vals); 
        if ($3==vals[1]) ip_diff="No change"; 
        else if (!vals[1]) ip_diff=$3"(up)"; 
        else ip_diff=$3/vals[1]; 
        if ($4==vals[2]) op_diff="No change"; 
        else if (!vals[2]) op_diff=$4"(up)"; 
        else op_diff=$4/vals[2]; 
        print k, $3, percent(ip_diff), $4, percent(op_diff); next 
    }
    { print $1,$2,$3,"New",$4,"New" }' f1.csv f2.csv