2013-12-20 153 views
2

創建列這是我的開關輸入txt文件AWK,不同的價值觀

2013121612,HCDC,0 
2013121613,HCDC,84 
2013121614,HCDC,100 
2013121615,HCDC,98 
2013121612,MSLP,1023.83 
2013121613,MSLP,1023.02 
2013121614,MSLP,1022.08 
2013121615,MSLP,1021.61 
2013121612,MAXT,12.723 
2013121613,MAXT,13.412 
2013121614,MAXT,13.41 
2013121615,MAXT,12.482 

這是我不好或不足代碼

awk -F"," '/MAXT|HCDC|MSLP/ {print $1,"\t",$3,"\t",$3,"\t",$3}' input.txt >> ouput.txt 

,這是德輸出文件

DATE MAXT HCDC MSLP  
2013121612 0 0 0 
2013121613 84  84  84 
2013121614 100  100  100 
2013121615 98  98  98 
2013121612 1023.03  1023.03  1023.03 
2013121613 1023.02  1023.02  1023.02 
2013121614 1022.08  1022.08  1022.08 
2013121615 1020.84  1020.84  1020.84 
2013121612 12.723  12.723  12.723 
2013121613 13.412  13.412  13.412 
2013121614 13.41   13.41  13.41 
2013121615 12.482  12.482  12.482 

我需要的是這種輸出格式...

DATE MAXT HCDC MSLP 
2013121612 12.723  0  1023.03 
2013121613 13.412   84  1023.02 
2013121614 13.41   100  1022.08 
2013121615 12.482  98  1020.84 

我被迫尋求幫助,因爲我的UNIX的知識是少之又少

非常感謝你

回答

1
awk -F, '!($1 in seen){dr[++i]=$1};{d=$1; v=$3; $0=$2; seen[d]++}; 
    /HCDC/{HCDC[d]=v}; /MSLP/{MSLP[d]=v};/MAXT/{MAXT[d]=v}; 
    END{print "DATE", "MAXT", "HCDC", "MSLP"; 
     for (j=1; j<=i; ++j) {print dr[j], (dr[j] in MAXT)? MAXT[dr[j]]: 0, 
           (dr[j] in HCDC)? HCDC[dr[j]]: 0, 
           (dr[j] in MSLP)? MSLP[dr[j]]: 0}}' input.txt 

DATE MAXT HCDC MSLP 
2013121612 12.723 0 1023.83 
2013121613 13.412 84 1023.02 
2013121614 13.41 100 1022.08 
2013121615 12.482 98 1021.61 
+0

在所有情況下awk都能正常工作,我很感謝所有人的快速回復 濫用了一下: 這就是這個單一的bash只有奇數或偶數MSLP(只有一個,因爲我有兩個MSLP小時值,我需要刪除一個,我認爲他自己做一個不同的bash) 謝謝大家 – raposu

+0

這個作品完美..區分MSLP的奇數對 MSLP內存在同一日期有兩個值,它只需要一個 這完全 – raposu

+0

dr [j]在HCDC中)? HCDC [dr [j]]:0可以直接替換爲dr [j] +0 – BMW

1

你基本上是試圖轉動表,使用兩列重塑它。你可以使用專門的語言(R擅長這樣的任務)。 awk不是這類工作的最佳語言(儘管它確實有可能使用它)。我建議用Python重寫它,這可能更容易一些。大綱(沒有錯誤檢查和等)的代碼低於:

tbl = {}  # map date to a dict of colname->values 

# ingest the data 

for line in myfile: 
    rec = line.split() 

    if rec[0] not in tbl: 
     tbl[rec[0]] = {} 

    tbl[rec[0]][rec[1]] = double(rec[2]) 

# output the table 

for date in tbl: 
    print date, tbl[date]['MAXT'], tbl[date]['HCDC'], tbl[date]['MSLP'] 

注意,這可能是更容易使用NumPy的(實際上是一個兩班輪),但我不知道這是值得做這樣的依賴這樣一個小任務。

+0

對不起**文件 「output.py」,10號線 如果REC [0]是不是在TBL:** – raposu

+0

對不起,修正了錯字 –

2

這裏的AWK:

awk -F, ' 
    { 
     key[$1] = 1 
     data[$1,$2] = $3 
    } 
    END { 
     print "DATE","MAXT","HCDC","MSLP" 
     for (k in key) 
      print k, data[k,"MAXT"], data[k,"HCDC"], data[k,"MSLP"] 
    } 
' input.txt | column -t 
DATE  MAXT HCDC MSLP 
2013121612 12.723 0  1023.83 
2013121613 13.412 84 1023.02 
2013121614 13.41 100 1022.08 
2013121615 12.482 98 1021.61 

因爲我使用的關聯數組,按鍵的順序是不能保證。如果需要輸出,所以像這樣的bash代碼進行排序:

{ 
    echo DATE MAXT HCDC MSLP 
    awk -F, ' 
     { key[$1] = 1; data[$1,$2] = $3 } 
     END { for (k in key) print k, data[k,"MAXT"], data[k,"HCDC"], data[k,"MSLP"] } 
    ' input.txt | sort 
} | column -t 
+0

MSLP現在去,但日期不能正常工作,爲什麼?未知,因爲該MSLP有兩個值在同一日期如下的bash: 2013121905,MSLP,1017.14 2013121905,MSLP,1016.29 對不起...。日期現在攜帶它的價值,但混亂 – raposu

+0

,你想輸出兩行爲不同的數據,但同一日期? –

+0

@ 1_CR腳本工作完美...區分MSLP對奇數對,MSLP內存有兩個值爲同一日期,它只需要一個它是完美的。你修改了代碼?我最初看起來像它的工作,現在隨機設置日期 – raposu