免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 9793 | 回复: 31
打印 上一主题 下一主题

请教个文本处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-05 20:06 |只看该作者 |倒序浏览
原始文件格式这种样子
&1=99&2=100
&1=100&3=111
&1=99&2=1&3=111
&1=99&3=111&4=110
&1=99&2=111&3=66&4=100&5=44
打印出结果为
99     100     0        0       0
100   0         111    0       0
99     1         111    0       0
99     0         111    110   0
99     111     66      110   44

请教大家

论坛徽章:
0
2 [报告]
发表于 2009-03-05 20:39 |只看该作者
sed 's/[&=]/ /g' file|awk '{for(k=1;k<=5;k++) a[k]="x";for(k=1;k<=NF;k+=2) a[$k]=$(k+1);for(k=1;k<=5;k++){if(a[k] !~ /[0-9]+/) a[k]=0;} print a[1],a[2],a[3],a[4],a[5];}'


上面的5是根据一行数据项的数目来定的.
用perl
perl -nWle '@exp=/&(\d+=\d+)/g;@field[0..4]=(0,0,0,0,0);do { s/^(\d+)/\$field[$1-1]/;eval ($_);} for @exp;print join(" ",@field);' file
简化一下:
perl -nWle '$,=" ";@field{1..5}=(0,0,0,0,0);%field=(%field,/\d+/g);print map { $field{$_} } sort keys %field;' file

也写个bash的
cat file|while read line;do result=(0 0 0 0 0 0);field=(${line//[&=]/ });result=$field;for((i=1;i<${#field[@]};i+=2));do pos=${field[$i]};value=${field[$i+1]};result[$pos]=$value;done;echo "${result[@]}";done

[ 本帖最后由 dream3401 于 2009-3-6 07:44 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-05 20:56 |只看该作者
sed 's/[&=]/ /g' tay.log|awk '{for(i=1;i<=5;i++) a=" ";for(i=1;i<=NF;i+=2) a[$i]=$(i+1);for(i=1;i<=5;i++){if(a !~ /[0-9]+/) a=0;} print a[1],a[2],a[3],a[4],a[5];}'
awk: (FILENAME=- FNR=1) fatal: attempt to use scalar `a' as array
报错啊 呵呵

论坛徽章:
0
4 [报告]
发表于 2009-03-05 21:26 |只看该作者
  1. awk 'BEGIN{FS="&";}{for(i=2;i<=6;i++){indx=substr($i,1,1);if(length(indx)==0){for(j=i-1;j<=6;j++){length(a[j])?1:a[j]=0};break;};if(indx!=i-1){a[i-1]=0;};a[indx]=substr($i,3);};for(i=1;i<=5;i++){printf("%3s   ",a[i])};printf "\n";}'
复制代码


刚才有点小错误重新编辑,现在OK了(洗脚水都凉了:(  )

[ 本帖最后由 justlooks 于 2009-3-5 21:39 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-03-05 21:33 |只看该作者
原帖由 ccie307 于 2009-3-5 20:56 发表
sed 's/[&=]/ /g' tay.log|awk '{for(i=1;i

可能是论坛的原因吧,我开始写的是a[ i ]数组的形式,结果一发表,都成了标量的a,现在改了一下,变成a[k],就好了

[ 本帖最后由 dream3401 于 2009-3-5 21:36 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-05 21:49 |只看该作者
谢谢兄弟们了

论坛徽章:
0
7 [报告]
发表于 2009-03-05 21:52 |只看该作者
再加点儿 需求 嘿嘿

172.27.38.0&1=99&2=100
192.168.9.2&1=100&3=111
202.96.64.68&1=99&2=1&3=111
202.96.69.38&1=99&3=111&4=110
202.77.88.99&1=99&2=111&3=66&4=100&5=44

172.27.38.0   99     100     0        0       0
192.168.9.2   100   0         111    0       0
202.96.64.68  99     1         111    0       0
202.96.69.38  99     0         111    110   0
202.77.88.99  99     111     66      110   44

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
8 [报告]
发表于 2009-03-05 21:53 |只看该作者
awk -F'[&=]' 'BEGIN{for(j=1;j<=6;j++)a[j]=0}{for(k=2;k<NF;k+=2)a[$k]=$(k+1);for(k=1;k<=5;k++)printf k==5?a[k]"\n":a[k]"\t";for(j=1;j<=6;j++)a[j]=0}' urfile

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
9 [报告]
发表于 2009-03-05 22:02 |只看该作者
原帖由 ccie307 于 2009-3-5 21:52 发表
再加点儿 需求 嘿嘿

172.27.38.0&1=99&2=100
192.168.9.2&1=100&3=111
202.96.64.68&1=99&2=1&3=111
202.96.69.38&1=99&3=111&4=110
202.77.88.99&1=99&2=111&3=66&4=100&5=44

172.27.38.0   99     100     0        0       0
192.168.9.2   100   0         111    0       0
202.96.64.68  99     1         111    0       0
202.96.69.38  99     0         111    110   0
202.77.88.99  99     111     66      110   44

awk -F'[&=]' 'BEGIN{for(j=1;j<=6;j++)a[j]=0}{for(k=2;k<NF;k+=2)a[$k]=$(k+1);print $1"\t"a[1]"\t"a[2]"\t"a[3]"\t"a[4]"\t"a[5];for(j=1;j<=6;j++)a[j]=0}' urfile

论坛徽章:
0
10 [报告]
发表于 2009-03-05 22:03 |只看该作者
加点要求,就把字段往后推一下:
awk -F'[&=]' '{a[1]=$1;for(k=2;k<=6;k++) a[k]="0";for(k=2;k<=NF;k+=2) a[$k+1]=$(k+1); print a[1],a[2],a[3],a[4],a[5],a[6];}' file
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP