命令行编辑.CSV文件

时间:2017-04-19 17:46:06

标签: linux bash csv sed scripting

我有一个.CSV文件,其中行具有相同的ID。

这是一个示例.CSV文件:

Alias,Date,Volume,Type,Type2,MSI
ID1,20170418,0.516006112,CHART,GAS,10-10-10-1
ID2,20170418,4.03900528,CHART,GAS,10-10-10-2
ID2,20170418,0.399999887,METER,OIL,10-10-10-2
ID2,20170418,0,METER,CONDY,10-10-10-2
ID3,20170418,0.399999887,CHART,GAS,10-10-10-3
ID4,20170418,6.599591255,CHART,GAS,10-10-10-4
ID5,20170418,4.6501894,CHART,GAS,10-10-10-5
ID6,20170418,1.831178546,CHART,GAS,10-10-10-6
ID6,20170418,0.190000013,METER,OIL,10-10-10-6
ID6,20170418,0,METER,CONDY,10-10-10-6

我需要创建一个Linux脚本来编辑这个.CSV文件,如下所示:

Alias,Date,Volume,Type,Type2,MSI,Volume Oil, Volume Condy
ID1,20170418,0.516006112,CHART,GAS,10-10-10-1,,
ID2,20170418,4.03900528,CHART,GAS,10-10-10-2,0.399999887,0
ID3,20170418,0.399999887,CHART,GAS,10-10-10-3,,
ID4,20170418,6.599591255,CHART,GAS,10-10-10-4,,
ID5,20170418,4.6501894,CHART,GAS,10-10-10-5,,
ID6,20170418,1.831178546,CHART,GAS,10-10-10-6,0.190000013,0

如果重复Alias字段......

并且行有METER OIL:在上一行中将音量移动到'Volume Oil',删除此行

并且行有METER CONDY:将音量移到前一行的'Volume Condy',删除此行

1 个答案:

答案 0 :(得分:0)

awk 方法(假设只有三条记录具有相同的ID):

awk -F, 'BEGIN{print "Alias,Date,Volume,Type,Type2,MSI,Volume Oil,Volume Condy"; }
         NR>1{ (a[$1])? gsub(/,*$/, FS$3, a[$1]) : a[$1]=$0 FS FS}
         END{ for(i in a) print a[i] }' file.csv

输出:

Alias,Date,Volume,Type,Type2,MSI,Volume Oil,Volume Condy
ID1,20170418,0.516006112,CHART,GAS,10-10-10-1,,
ID2,20170418,4.03900528,CHART,GAS,10-10-10-2,0.399999887,0
ID3,20170418,0.399999887,CHART,GAS,10-10-10-3,,
ID4,20170418,6.599591255,CHART,GAS,10-10-10-4,,
ID5,20170418,4.6501894,CHART,GAS,10-10-10-5,,
ID6,20170418,1.831178546,CHART,GAS,10-10-10-6,0.190000013,0