我有一个文件,其一部分看起来像这样:
Date,Open,High
2018-08-29,1624.0,1628.8
2018-08-28,1658.85,1669.55
2018-08-27,1649.0,1655.45
我打算做的是通过从上一行的第二列 Open 中减去第三列 High 来创建新列,基本上是 1669.55-1624.0 < / strong>,等等。
使最终输出看起来像:
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,但无法正常工作。我尝试阅读有关在awk中使用arrays的信息,但在我的特定情况下也不是很成功。
一个简单的awk解决方案以及一个基本的解释,我将不胜感激。
答案 0 :(得分:2)
$ 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