免费注册 查看新帖 |

Chinaunix

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

一个很烦的问题,请大家指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-06 23:10 |只看该作者 |倒序浏览
一个问题困扰我很长时间了,一直找不到解决的办法,请各位想想办法,本人水平有限,请大家详细说明,先行谢过!
有一文件举例如下:
1001|11617682|52|||
1001|25232222||52||
1002|11852633|10000|||
1002|34384462||5000||
1002|343355922231||5000||
1003|11657497|800|||
1003|25287655||800||
1004|11529985||200||
1004|997452333334|200|||
。。。。。

文件列数固定,按第一列顺序排列。
我的问题是想找出所有第一列顺序号相同的两行(是两行不是三行),然后判断第二列,若第一行第二列为“11"开头第二行第二列为“25”开头,则将此两行另存。如上例中1001两行、1003两行应另存

[ 本帖最后由 hongqi 于 2006-10-7 21:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-06 23:25 |只看该作者
问题不清楚

论坛徽章:
0
3 [报告]
发表于 2006-10-07 19:51 |只看该作者
我的方法比较笨,分4步:
1) 取出第一列数量为2的序号

  1. sort -n vsort.dat | awk -F'|' '{a[$1]+=1;}END{for(i in a) if(a[i]==2) print i;}' > vsort.dat.1
复制代码

2)取出文件中包含第一步那些序号的行

  1. fgrep -f vsort.dat.1 vsort.dat > vsort.dat.2
复制代码

3)取出符合你的条件的行的序号

  1. awk -F'|' 'BEGIN{i=0;}{for(;i<NR;i++) {a[i]=$1;b[i]=$2;}} END {for(i=0;i<NR;i+=2) {if(substr(b[i],1,2)==11 && substr(b[i+1],1,2)==25) print a[i]}}' vsort.dat.2 > vsort.dat.3
复制代码

4)取出第三步得到的序号的行

  1. fgrep -f vsort.dat.3 vsort.dat > result.dat
复制代码


另:如果第三步改为:

  1. awk -F'|' '{for(i=0;i<NR;i++) {a[i]=$1;b[i]=$2;}} END {for(j=0;j<NR;j+=2) {if(substr(b[j],1,2)==11 && substr(b[j+1],1,2)==25) print a[j]}}' vsort.dat.2 > vsort.dat.3
复制代码

出来的结果就很混乱, 以下是测试结果:

  1. awk -F'|' '{for(i=0;i<NR;i++) {a[i]=$1;b[i]=$2; print i, a[i], b[i];}} END {for(j=0;j<NR;j++) {print a[j],b[j];}}' vsort.dat
复制代码

0 1001 11617682
0 1001 25232222
1 1001 25232222
0 1003 11657497
1 1003 11657497
2 1003 11657497
0 1003 25287655
1 1003 25287655
2 1003 25287655
3 1003 25287655
0 1004 11529985
1 1004 11529985
2 1004 11529985
3 1004 11529985
4 1004 11529985
0 1004 997452333334
1 1004 997452333334
2 1004 997452333334
3 1004 997452333334
4 1004 997452333334
5 1004 997452333334
1004 997452333334
1004 997452333334
1004 997452333334
1004 997452333334
1004 997452333334
1004 997452333334

各位老大给予解释,谢谢
Ubuntu:~/Scripts$ awk --version
GNU Awk 3.1.5

[ 本帖最后由 hackevin 于 2006-10-7 19:57 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-10-07 21:37 |只看该作者
awk 我不懂,明天上班试试,多谢多谢

论坛徽章:
0
5 [报告]
发表于 2006-10-08 14:31 |只看该作者
awk -F'|' '{if($1 == last1){if(substr($2,0,2) == "25" && substr(last2,0,2) == "11" ){print lastline; print $0;} ;}; last1=$1;last2=$2;lastline=$0;}' A.txt

[root@shwhg tmp]# awk --version
GNU Awk 3.1.3
Copyright (C) 1989, 1991-2003 Free Software Foundation.
bsh/csh/ksh/红旗9.0下测试通过

[ 本帖最后由 cceczjxy 于 2006-10-8 14:35 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-10-08 15:38 |只看该作者
楼上的对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP