2015-05-26 54 views
2

我有這樣一個CSV文件(日期值只有7天,而不是靜態的):行分列在csv文件

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

+0

第一:關於如何處理任何建議這個問題?你應該提供一些關於這是什麼邏輯的指示。顯示兩個文件並要求腳本從一個文件轉到另一個文件沒有意義。相反,請指出數據發生了什麼,它的含義以及到目前爲止所嘗試的內容 – fedorqui

+0

編輯了我的問題。日期值只有7個不同的日期,但不是靜態的。但是線條也不是靜止的,有些日子只有2條線,還有幾天。這就是爲什麼我使用...因爲它不是靜態的。 – phe

+0

[在bash中轉置文件]的可能重複(http://stackoverflow.com/questions/1729824/transpose-a-file-in-bash) –

回答

1
$ cat tst.awk 
BEGIN { FS="[[:space:]]*,[[:space:]]*"; OFS="," } 
NR==1 { cell[++numDates,++numPaths] = $2; next } 
{ date = $1; path = $2 } 
!(date in date2nr) { date2nr[date] = ++numDates; cell[numDates,1] = date } 
!(path in path2nr) { path2nr[path] = ++numPaths; cell[1,numPaths] = path } 
{ cell[date2nr[date],path2nr[path]] = $3 } 
END { 
    for (pathNr=1; pathNr<=numPaths; pathNr++) { 
     for (dateNr=1; dateNr<=numDates; dateNr++) { 
      printf "%s%s", cell[dateNr,pathNr], (dateNr<numDates?OFS:ORS) 
     } 
    } 
} 

$ awk -f tst.awk file 
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 
+1

謝謝,爲了便於理解,添加了excel示例。我正在處理您的示例,我想我需要選擇不同的日期值並在PATH後打印, – phe

+1

excel圖像幫助澄清了很多,謝謝您的提供。我已經更新了我的答案。 –

1

您所希望的輸出是不是輸入的純換位,也不清楚是否有場對數的純映射所需輸出中的空白字段。 (我認爲這是真的)

如果這是正確的,這Python程序你想要做什麼:

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)  

打印:

PATH 20.05.2015,20.05.2015,20.05.2015,20.05.2015,21.05.2015,21.05.2015,21.05.2015,21.05.2015,22.05.2015,22.05.2015,22.05.2015,22.05.2015,22.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 
+0

編輯我的問題,抱歉誤會。我不想爲相同的日期值多列。增加了excel示例。謝謝。 – phe