【问题标题】:comparing more than 2 columns in a csv file and create new column in the csv file比较 csv 文件中超过 2 列并在 csv 文件中创建新列
【发布时间】:2018-01-16 17:47:39
【问题描述】:

我有 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 backlog和o/p backlog的偏差百分比,并为输入趋势和输出趋势创建2个单独的列。

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

所以我的最终工作表应该如下所示。

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

【问题讨论】:

  • 180 - 是从200 减少的10%,而不是20%
  • 请阅读how to ask并编辑您的帖子
  • 嗨 Roman.. 是的,它减少了 10%.. 这是我的错误...
  • @user2642751,如果2.csv 中的某个I/P Backlog 值是10 并且1.csv 中的相应值是0 怎么办?在这种情况下 - 百分比没有办法
  • 好问题..我需要考虑一下...可能需要忽略这种情况...

标签: shell unix awk


【解决方案1】:

扩展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

输出:

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

【讨论】:

  • 感谢 Roman 的帮助。但是除了 NEW 之外,它没有显示任何内容。 Server,Path,I/P Backlog,O/P Backlog 输入趋势 输出趋势 Server1,EP,3300,180 New New Server3,DC,7,0 New New Server5,DC,0,0 New New Server6,EC,10,200 New新
  • @user2642751,这不是真的。这是截图ibb.co/iR8V2R。你的awk --version 是什么?
  • 抱歉.. 我找不到版本.. 仍在尝试获取.. 试过 /usr/xpg4/bin/awk -V 版本 /usr/xpg4/bin/awk -W 版本/usr/xpg4/bin/awk -version
  • 什么 /bin/awk /bin/awk:SunOS 5.10 Generic 148336-01 Dec 2011
  • @user2642751,我的意思是找不到命令文本,而是运行命令awk --version
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多