行到csv文件中的列

时间:2015-05-26 13:57:08

标签: bash shell csv awk

我有一个像这样的csv文件(日期值只有7天,但不是静态的):

DATE,PATH,%
20.05.2015,RAM,0
20.05.2015,SWAP,00
20.05.2015, /, 000
20.05.2015, /dev, 0000
21.05.2015,RAM,1
21.05.2015,SWAP,11
21.05.2015, /, 111
21.05.2015, /dev, 1111
22.05.2015,RAM,2
22.05.2015,SWAP,22
22.05.2015, /, 222
22.05.2015, /dev, 2222
22.05.2015, /root, 22222
22.05.2015, /root2, 222222
23.05.2015, /root2, 333333
24.05.2015, /root2, 444444
25.05.2015, /root2, 555555
26.05.2015, /root2, 666666

我需要将行的日期值打印到这样的列:

PATH,20.05.2015,21.05.2015,22.05.2015,23.05.2015,24.05.2015,25.05.2015,26.05.2015
RAM,0,1,2,,,,
SWAP,00,11,22,,,,
/,000,111,222,,,,
/dev,0000,1111,2222,,,,
/root,,,22222,,,,
/root2,,,222222,333333,444444,555555,666666

对awk或其他方式的任何建议?

我尝试了关于这个主题的解决方案:

An efficient way to transpose a file in Bash

但这是一个不同的问题,我无法解决我的问题。

Excel视图以便于理解:

enter image description here

2 个答案:

答案 0 :(得分:1)

X

答案 1 :(得分:1)

您希望输出不是输入的纯转置,也不清楚是否存在所需输出中字段数到空白字段的纯映射。 (我认为这是真的。)

如果这是正确的,这个Python程序可以做你想要的:

<html>

<body>

</body>

</html>

打印:

import csv
from collections import OrderedDict

data=OrderedDict()

with open(fn) as f:
    reader=csv.reader(f, skipinitialspace=True)
    header=next(reader)
    data[header[1]]=[]
    for line in reader:
        if line[1] not in data:
            data[line[1]]=[]

with open(fn) as f:
    reader=csv.reader(f, skipinitialspace=True)
    header=next(reader)
    for line in reader:
        data[header[1]].append(line[0])
        data[line[1]].append(line[2])
        for e in set(data.keys())-set([header[1],line[1]]):
            data[e].append('')

for k, v in data.items():
    print k, ','.join(v)