Chinaunix

标题: shell [打印本页]

作者: biobaby    时间: 2016-01-27 12:56
标题: shell
大家好,我这里有一个文件想要合并第一列相同的那些行。
比如:文件file,内容如下:
wo        1        2        3
wo        d        j        u
ni        8        h        3
ni        e        3        9
ni        3        k        5       
ta        1        6        0
he        h        6        9
he        t        m        8
我想要的输出结果如下:
wo        1;d        2;j        3;u
ni        8;e;3        h;3;k        3;9;5
ta        1        6        0
he        h;t        6;m        9;8
第一列相同的行的其他列都合并,并以分号分开。 输出列之间用\t分隔。

不知道表述清楚没有,急用,谢谢各位大神了!!!

作者: elu_ligao    时间: 2016-01-27 13:42
  1. awk '!a[$1]++{b[++k]=$1}{col2[$1]=col2[$1]";"$2;col3[$1]=col3[$1]";"$3;col4[$1]=col4[$1]";"$4}END{for(i=1;i<=k;++i){print b[i]"\t"substr(col2[b[i]],2)"\t"substr(col3[b[i]],2)"\t"substr(col4[b[i]],2)}}' file
复制代码

作者: ydzcjj    时间: 2016-01-27 13:51
楼上好评,,,  学习了!
作者: haooooaaa    时间: 2016-01-27 14:33
  1. awk '{for(i=2;i<=NF;i++)a[$1,i]=a[$1,i]?a[$1,i]";"$i:$i;b[$1]}END{for(i in b){s=i;for(j=2;j<=NF;j++)s=s"\t"a[i,j];print s}}' file
复制代码

作者: wp7731695    时间: 2016-01-27 14:40
awk '{if(a[$1]) {split(a[$1],b);a[$1]=b[1]" "b[2]";"$2" "b[3]";"$3" "b[4]";"$4} else {a[$1]=$0}}END{for (i in a) print a[i]}' test.txt | column -t
作者: 关阴月飞    时间: 2016-01-27 14:43
本帖最后由 关阴月飞 于 2016-01-27 14:44 编辑
  1. awk '{s[$1];for(i=1;i++<NF;)a[$1,i]=a[$1,i]!=""?a[$1,i]";"$i:$i}END{for(i in s){for(n=1;n++<NF;)b=b"\t"a[i,n];print i,b;b=c}}' urfile
复制代码

作者: jason680    时间: 2016-01-27 15:22
回复 1# biobaby

$ awk '{for(n=2;n<=NF;++n){a[$1,n]=a[$1,n]a[$1,1]$n};a[$1,1]=";";if(!a[$1]++)d[++t]=$1}END{for(n=1;n<=t;++n){p=d[n];for(m=2;m<=t;++m)p=p"\t"a[d[n],m];print p}}' FILE
wo        1;d        2;j        3;u
ni        8;e;3        h;3;k        3;9;5
ta        1        6        0
he        h;t        6;m        9;8

$ awk 'function x(n,p){c="";p=k;for(n=2;n<=NF;++n)p=p"\t"a[n];print p;delete a}{if(k!=$1)if(k)x();k=$1;for(n=1;n<=NF;++n)a[n]=a[n]c$n;c=";"}END{x()}' FILE
wo        1;d        2;j        3;u
ni        8;e;3        h;3;k        3;9;5
ta        1        6        0
he        h;t        6;m        9;8

   
作者: biobaby    时间: 2016-01-27 15:29
谢谢您。
回复 2# elu_ligao


   
作者: biobaby    时间: 2016-01-27 15:29
谢谢~
回复 4# haooooaaa


   
作者: biobaby    时间: 2016-01-27 15:30
谢谢大家 问题已解决,非常感谢
作者: _R__    时间: 2016-01-28 14:15
本帖最后由 _R__ 于 2016-01-28 14:16 编辑

awk '{b[$1]="";for (i=2;i<=NF;i++){a[$1,i]=a[$1,i]?a[$1,i]";"$i:$i;b[$1]=b[$1]"\t"a[$1,i]}}END{for (i in b)print i,b}'




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2