簡體   English   中英

awk,為不同的值創建列

[英]awk,creating columns for different values

這是我的輸入txt文件

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的了解很少

非常感謝你

這是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

您基本上是在嘗試透視表,使用兩列重塑它。 您可以為此使用專門的語言(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可能會更容易(實際上是兩線),但是我不確定將它作為如此小的任務的依賴項是否值得。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM