首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用awk根据不同列中的前一行和同一列的当前行的值生成新列

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

Stack Overflow用户
提问于 2018-08-31 05:22:24
回答 1查看 92关注 0票数 0

我有一个文件,其中的一部分如下所示:

代码语言:javascript
复制
Date,Open,High
2018-08-29,1624.0,1628.8
2018-08-28,1658.85,1669.55
2018-08-27,1649.0,1655.45

我要做的是创建一个新的列,从上一行的第二列中减去第三列,基本上是1669.55 - 1624.0,依此类推。

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

代码语言:javascript
复制
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

我试过的并不是很聪明,就像这样:

代码语言:javascript
复制
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,但是我不能让它工作。我尝试阅读有关在awk中使用arrays的内容,但在我的特殊情况下也不是很成功。

这是一个简单的awk解决方案,我会非常欣赏,并提供一个基本的解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 06:16:29

代码语言:javascript
复制
$ 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52105533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档