awk处理案例十六--坐标显示数据

【场景】

1 14      1015    1
2 8       1015    2
3 8       1015    3
4 1       1016    3
5 8       1019    1
6 6       1019    2
7 2       1019    3
.......

要达到的效果是:

1 1015   14    8     8
2 1016               1
3 1019    8     6     2

【代码】

awk '{if(a==$2 || ! a){b[$3]=$1}else{if(! i in b)b[i]=FS;print a "\t" b[1] "\t" b[2] "\t" b[3];delete b;b[$3]=$1}a=$2}' file

【解析】
  思路:第2列与上一列相同;把第一列的值赋给数组b以第3列为下标。若不同;就开始打印。其中if(! i in b)b[i]=FS的意思是;若i不是数组b的下标;先把b[i]置为空格。

           其中delete b是清空该数组。

【拓展】

 关公的代码

awk 'FNR==NR{a[$2,$3]=$1;next}!b[$2]++{for(i=0;i++<3;)s=s"\t"a[$2,i];print $2,s;s=""}'  file file
awk '{a[$2"#"$3]=$1;if(!b[$2]++)c[++i]=$2}END{for(j=1;j<=i;j++)print a[c[j]"#"1],a[c[j]"#"2],a[c[j]"#"3]}'
awk '{if(!a[$2]++)b[++n]=$2;c[$2,$3]=$1}END{for(i=1;i<=n;i++){for(j=1;j<=3;j++)s=s?s"\t"c[b[i],j]:b[i]"\t"c[b[i],j];print s;s=""}}' 

【解析思路】

posted @ 2013-11-20 21:56  lottu  阅读(337)  评论(0)    收藏  举报