日期:2014-05-16  浏览次数:20669 次

shell处理数据:如何将列转换成行
接触shell没有多长时间,不知道awk和sed的功能,处理数据时很难下手,最近又遇到一个问题。
有个项目要提取源数据库数据,有一个需求是:把列的内容增加到行的内容里,如下,
文件a:
18900000000 1 快乐
18900000000 1 幸福
18900000000 1 美满
18977777777 1 
18966666666 1 美妙

现需将文件a转换成:
18900000000 1 快乐,幸福,美满
18977777777 1
18966666666 1 美妙

弄了一天,没有什么收获,各位大侠,有什么办法能解决吗?
万分感谢!

------解决方案--------------------
zhu@ubuntu:~/shell$ cat a.txt
18900000000 1 快乐
18900000000 1 幸福
18900000000 1 美满
18977777777 1
18966666666 1 美妙
zhu@ubuntu:~/shell$ cat a.txt|perl -ane 'if ($F[0] == $old) {print "\t$F[2]"} else {$old = $F[0]; print "\n", join("\t", @F);}'

18900000000 1 快乐 幸福 美满
18977777777 1
18966666666 1 美妙zhu@ubuntu:~/shell$ ^C
zhu@ubuntu:~/shell$ 

------解决方案--------------------
awk 'Begin{s;j=0}{if($1==i){s[j]=s[j]" "$3;next}{j++;s[j]=$0;i=$1}}END{len=asort(s);for(k=1;k<=len;k++){print s[k]}}' test.txt

------解决方案--------------------
Python code
$ awk '{a[$1" "$2]=a[$1" "$2]$3","}END{for(i in a)print i, gensub(",$","","G",a[i])}' log.a 
18966666666 1 美妙
18977777777 1 
18900000000 1 快乐,幸福,美满

------解决方案--------------------
探讨
Python code

$ awk '{a[$1" "$2]=a[$1" "$2]$3","}END{for(i in a)print i, gensub(",$","","G",a[i])}' log.a 
18966666666 1 美妙
18977777777 1 
18900000000 1 快乐,幸福,美满