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=""}}'
【解析思路】

浙公网安备 33010602011771号