[英]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.