2013-12-20 115 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