代码之家  ›  专栏  ›  技术社区  ›  Inder Manali

使用awk根据不同列中的前一行和同一列的当前行的值生成新列

  •  1
  • Inder Manali  · 技术社区  · 8 年前

    我有一个文件,其中一部分看起来像这样:

    Date,Open,High
    2018-08-29,1624.0,1628.8
    2018-08-28,1658.85,1669.55
    2018-08-27,1649.0,1655.45
    

    我打算做的是通过减去第3列来创建一个新列 从上一行的第2列 ,基本上 等等。

    这样最终输出将如下所示:

    Date,Open,High,gener
    2018-08-29,1624.0,1628.8
    2018-08-28,1658.85,1669.55,75.55
    2018-08-27,1649.0,1655.45,-3.4
    

    我试过的不是很聪明,比如:

    lines=$(cat test.csv|wc-l)
    lines=$((lines-2))
    
    for i in $(seq $lines);do
    l=$((i+2))
    sed -n "$lp" test.csv|awk -F, '{print $2 $3}' >> /dump/files.test
    #and then using values from this saved file to make changes within this for loop, using tail etc.
    

    这是非常缓慢,我不是很好与awk。我试图看手册和每一个相关的问题,但找不到任何具体做这样的事情。

    this question that is quite similar arrays 在awk,但这也不是很成功,在我的特殊情况。

    一个简单的awk解决方案,我将非常感谢伴随着一个基本的解释。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Ed Morton    8 年前
    $ awk 'BEGIN{FS=OFS=","} {print $0, (NR>1 ? $3-p : "gener"); p=$2}' file
    Date,Open,High,gener
    2018-08-29,1624.0,1628.8,1628.8
    2018-08-28,1658.85,1669.55,45.55
    2018-08-27,1649.0,1655.45,-3.4
    
    推荐文章