将同一ID的多个数据条目转换为行-awk

时间:2015-09-02 12:25:42

标签: awk

我的数据格式如下:

ID Date     X1 X2 X3
1  01/01/00 1  2  3
1  01/02/00 7  8  5
2  01/03/00 9  7  1
2  01/04/00 1  4  5

我想根据ID将测量分组为新行,所以我最终得到:

ID Date     X1 X2 X3 Date   X1_2 X2_2 X3_2
1  01/01/00 1  2  3 01/02/00 7  8  5
2  01/03/00 9  7  1 01/04/00 1  4  5

对于给定的ID,我有多达20个观察值。

到目前为止,我已尝试过http://gadgetsytecnologia.com/da622c17d34e6f13e/awk-transpose-childids-column-into-row.html

给出的技巧

到目前为止我尝试过的代码是:

awk -F, OFS = '\t' 'NR >1  {a[$1] = a[$1]; a[$2] = a[$2]; a[$3] = a[$3];a[$4] = a[$4]; a[$5] = a[$5] OFS $5} END {print "ID,Date,X1,X2,X3,Date_2,X1_2, X2_2 X3_2'\t' for (ID in a) print a[$1:$5] }' file.txt

该文件是制表符分隔文件。我不知道如何操纵数据,或者说每个人的观察结果会超过两个。

2 个答案:

答案 0 :(得分:1)

只需跟踪前一个字段的内容即可。如果更改,请打印存储的行:

awk 'NR==1 {print; next}  # print header
     prev && $1!=prev {print prev, line; line=""}   # print on different $1
     {prev=$1; $1=""; line=line $0}                 # store data and remove $1
     END {print prev, line}' file                   # print trailing line

如果您有以制表符分隔的字段,只需添加-F"\t"

测试

$ awk 'NR==1 {print; next} prev && $1!=prev {print prev, line; line=""} {prev=$1; $1=""; line=line $0} END {print prev, line}' a
ID Date     X1 X2 X3
1   01/01/00 1  2  3  01/02/00 7  8  5
2   01/03/00 9  7  1  01/04/00 1  4  5

答案 1 :(得分:0)

你可以尝试这个(gnu-awk解决方案)

gawk '
  NR == 1 {
    N = NF;
    MAX = NF-1;
    for(i=1; i<=NF; i++){  #store columns names
      names[i]=$i;
    }
    next;
  }
  {
    for(i=2; i<=N; i++){
      a[$1][length(a[$1])+1] = $i;  #store records for each id
    }
    if(length(a[$1])>MAX){
      MAX = length(a[$1]);
    }
  }
  END{
    firstline = names[1];
    for(i=1; i<=MAX; i++){          #print first line
      column = int((i-1)%(N-1))+2
      count = int((i-1)/(N-1));
      firstline=firstline OFS names[column];
      if(count>0){
        firstline=firstline"_"count
      }
    }
    print firstline
    for(id in a){          #print each record in store
      line = id;
      for(i=1; i<=length(a[id]); i++){
        line=line OFS a[id][i];
      }
      print line;
    }
  }
' input
  

输入

ID Date     X1 X2 X3
1  01/01/00 1  2  3
1  01/02/00 7  8  5
2  01/03/00 9  7  1
2  01/04/00 1  4  5
1  01/03/00 72 28 25

你得到了

ID Date     X1 X2 X3 Date_1   X1_1 X2_1 X3_1 Date_2   X1_2 X2_2 X3_2
1  01/01/00 1  2  3  01/02/00 7    8    5    01/03/00 72   28   25
2  01/03/00 9  7  1  01/04/00 1    4    5