Chinaunix
标题:
awk或perl文件转换
[打印本页]
作者:
yjs_sh
时间:
2014-10-10 15:14
标题:
awk或perl文件转换
我这边有一个文件,内容如下:
aaa 1 50
aaa 2 55
bbb 1 80
bbb 2 86
bbb 3 87
aaa 3 60
aaa 4 60
aaa 5 70
aaa 6 65
aaa 7 78
ccc 3 56
ccc 4 70
aaa 8 25
aaa 9 40
aaa 10 23
ccc 6 34
aaa 11 24
aaa 12 45
需要转成如下排列格式,总列数是13,第一列为名字,后面分别是12列的值,如果该列没有值的话就用空格代替
aaa,50,55,60,60,70,65,78,25,40,23,24,45
bbb,80,86,87, , , , , , , , , ,
ccc, , ,56,70, ,34, , , , , , ,
能否用AWK实现,perl也行,哪位大侠能实现或提供一下思路。多谢!
作者:
ly5066113
时间:
2014-10-10 15:22
本帖最后由 ly5066113 于 2014-10-10 15:22 编辑
回复
1#
yjs_sh
try:
awk '{a[$1","$2]=$3;b[$1]}END{for(i in b){printf i;for(j=1;j<=12;j++)printf ","a[i","j];print ""}}' file
复制代码
作者:
yjs_sh
时间:
2014-10-10 15:38
回复
2#
ly5066113
可以的,非常感谢!!
作者:
jason680
时间:
2014-10-10 15:39
回复
1#
yjs_sh
$ awk '!s[$1]++{N[++c]=$1}{a[$1,$2]=$3;if(m<$2)m=$2}END{for(t=1;t<=c;t++){printf N[t];for(n=1;n<=m;n++)printf","a[N[t],n];print""}}' FILE
aaa,50,55,60,60,70,65,78,25,40,23,24,45
bbb,80,86,87,,,,,,,,,
ccc,,,56,70,,34,,,,,,
作者:
yjs_sh
时间:
2014-10-10 16:10
ly5066113大侠的输出是ccc、bbb、aaa
jason680大侠的输出是aaa、bbb、ccc
a[$1","$2]=$3 这一句是什么意思?
作者:
jason680
时间:
2014-10-10 16:12
回复
5#
yjs_sh
awk数组的学习心得
http://bbs.chinaunix.net/forum.p ... mp;fromuid=24785593
作者:
yjs_sh
时间:
2014-10-10 16:42
非常感谢各位,awk又进步了一点
作者:
李满满
时间:
2014-10-10 17:39
学生党:飘过~无聊Python试试
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"just for fun"
import sys
import fileinput
list={}
temp=''
for x in fileinput.input(sys.argv[1]):
if not list.get(x.split()[0]):
list[x.split()[0]]=[]
list[x.split()[0]].append(x.split()[2])
for k,v in list.iteritems():
print k, ','.join(v)
复制代码
测试:
$ ./yhsafe.py yhsafe.txt
aaa 50,55,60,60,70,65,78,25,40,23,24,45
bbb 80,86,87
ccc 56,70,34
作者:
yjs_sh
时间:
2014-10-10 17:56
回复
8#
李满满
谢谢,不过python我没弄过:wink:
作者:
yestreenstars
时间:
2014-10-11 11:14
awk 4.0
$ awk '{a[$1][$2]=$3}END{for(i in a){printf i;for(j=0;j++<12;)printf ","a[i][j];print ""}}' i
aaa,50,55,60,60,70,65,78,25,40,23,24,45
ccc,,,56,70,,34,,,,,,
bbb,80,86,87,,,,,,,,,
复制代码
作者:
yestreenstars
时间:
2014-10-11 11:25
perl
[root@localhost ~]# perl -ane '$h{$F[0]}{$F[1]}=$F[2];END{for $k (sort keys %h){print $k;for $i (1..12){print ",".$h{$k}{$i}}print $/}}' i
aaa,50,55,60,60,70,65,78,25,40,23,24,45
bbb,80,86,87,,,,,,,,,
ccc,,,56,70,,34,,,,,,
[root@localhost ~]#
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2