免费注册 查看新帖 |

Chinaunix

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

请求shell朋友的帮助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-02 15:48 |只看该作者 |倒序浏览
有单位代码及排列顺序如下:
  1. A001
  2. A002
  3. A021
  4. A022
  5. A023
  6. A025
  7. A027
  8. A029
  9. A031
  10. A093
  11. A094
  12. A095
复制代码
这样的顺序重复6次

现从数据库提取数据时,如果某单位无数据时就会缺行,如下:
  1. # cat datas
  2. A001 9725.11 A
  3. A021 8856.12 M
  4. A023 9925.17 P
  5. A025 0012.45 O
  6. A031 1010.11 K
  7. A093 2001.59 L
  8. A095 4500.09 Y
复制代码
以下数据重复6次,但缺失的单位不尽相同;
现要求用shell补齐所有单位,并为缺失的单位输出“单位代码 0 Q”,并且单位顺序不可混乱:
  1. A001 9725.11 A
  2. A002 0 Q
  3. A021 8856.12 M
  4. A022 0 Q
  5. A023 9925.17 P
  6. A025 0012.45 O
  7. A027 0 Q
  8. A029 0 Q
  9. A031 1010.11 K
  10. A093 2001.59 L
  11. A094 0 Q
  12. A095 4500.09 Y
复制代码
本人的代码如下:
  1. awk 'BEGIN{split("A001 A002 A021 A022 A023 A025 A027 A029 A031 A093 A094 A095",C," ");i=1}
  2. {
  3.         if($1==C[i]){printf("%s %s %s\n",$1,$2,$3)}else{printf("%s 0 Q\n",C[i++])};
  4.         i++;
  5.         if(i==13){i=1};
  6. }' datas
复制代码
但如果有两个或两个以上连续的单位缺失时,结果就不对了,希望大家帮忙!
谢谢

论坛徽章:
0
2 [报告]
发表于 2004-11-02 17:14 |只看该作者

请求shell朋友的帮助!

不知道这样符合你的要求吗?

  1. #! /bin/sh

  2. arry=(A001 A002 A021 A022 A023 A025 A027 A029 A031 A093 A094 A095)
  3. num=0
  4. while read Line
  5. do
  6. varlocal=(echo ${Line})
  7. #echo $num
  8. #echo "${varlocal[1]} = ${arry[$num]}"
  9. while [ ! "${varlocal[1]}" = "${arry[$num]}" ]
  10. do
  11. echo "${arry[${num}]}"' 0 Q'
  12. num=$(expr $num + 1)
  13. [ "$num" -eq "12" ]&&num=0
  14. done
  15. echo "$Line"
  16. num=$(expr $num + 1)
  17. [ "$num" -eq "12" ]&&num=0
  18. done < data.txt
复制代码
$ cat data.txt
A001 9725.11 A
A021 8856.12 M
A023 9925.17 P
A025 0012.45 O
A031 1010.11 K
A093 2001.59 L
A095 4500.09 Y
A001 9725.11 A
A021 8856.12 M
A023 9925.17 P
A025 0012.45 O
A031 1010.11 K
A093 2001.59 L
A095 4500.09 Y


$ ./tt1.sh
A001 9725.11 A
A002 0 Q
A021 8856.12 M
A022 0 Q
A023 9925.17 P
A025 0012.45 O
A027 0 Q
A029 0 Q
A031 1010.11 K
A093 2001.59 L
A094 0 Q
A095 4500.09 Y
A001 9725.11 A
A002 0 Q
A021 8856.12 M
A022 0 Q
A023 9925.17 P
A025 0012.45 O
A027 0 Q
A029 0 Q
A031 1010.11 K
A093 2001.59 L
A094 0 Q
A095 4500.09 Y

论坛徽章:
0
3 [报告]
发表于 2004-11-02 17:30 |只看该作者

请求shell朋友的帮助!

[quote]原帖由 "guangzongy"][/quote 发表:

OK!
谢谢!

论坛徽章:
0
4 [报告]
发表于 2004-11-02 20:35 |只看该作者

请求shell朋友的帮助!

  1. touch okfile
  2. while read line
  3.         do
  4.         if grep "$line" datas>/dev/null 2>&1
  5.                 then line=$(grep "$line" datas)
  6.                 else line=$(echo "$line" 0 Q)
  7.         fi
  8.         echo $line>>okfile
  9.         done<file
  10. mv okfile datas
复制代码


测试通过

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-11-02 20:39 |只看该作者

请求shell朋友的帮助!

原帖由 "bitbull" 发表:

测试通过

不错~~~    

论坛徽章:
0
6 [报告]
发表于 2004-11-02 21:11 |只看该作者

请求shell朋友的帮助!

原帖由 "哈" 发表:
如果有两个或两个以上连续的单位缺失时,结果就不对了,希望大家帮忙!
谢谢


在unix5.0.5下通过:

nawk ' BEGIN { i = 1; while((getline < "datas" > 0){
F = $1; S = $2; T = $3; i++ } line = i }
iFound = 0;
{ for(j = 1; j<= line; j++){
if($1 ==  f){
printf("%s %12.2f %s\n", F[j], S[j], T[j])
iFound =1;}
}
if(!iFound) printf("%s %12.2f Q\n", $0, 0);}'  dwbh

其中:datas 为数据文件,dwbh 为单位代码文件。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-11-02 21:18 |只看该作者

请求shell朋友的帮助!

原帖由 "begincwcw" 发表:
und =1;}
}
if(!iFound) printf("%s %12.2f Q\n", $0, 0);}'  dwbh

其中:datas 为数据文件,dwbh 为单位代码文件。

牛~~~~,高手也!!! 佩服!!!!

论坛徽章:
0
8 [报告]
发表于 2004-11-02 21:57 |只看该作者

请求shell朋友的帮助!

原帖由 "begincwcw" 发表:
und =1;}
}
if(!iFound) printf("%s %12.2f Q\n", $0, 0);}'  dwbh

其中:datas 为数据文件,dwbh 为单位代码文件。


begincwcw兄是AWK方面的专家呀,HOHO~~
小弟正加油,受教
      

论坛徽章:
0
9 [报告]
发表于 2004-11-02 22:04 |只看该作者

请求shell朋友的帮助!

原帖由 "bitbull" 发表:


begincwcw兄是AWK方面的专家呀,HOHO~~
小弟正加油,受教
      


称不上专家,用的比较多而已。

论坛徽章:
0
10 [报告]
发表于 2004-11-02 22:36 |只看该作者

请求shell朋友的帮助!

for name in `awk '{print $1}' 1`
do
        s1=`sed -n "/$name/"p 2`
        if [ "$s1" !=  "" ]
        then
                echo $s1
        else
                echo $name "0 Q"
        fi
done


1 is code file
2 is data file
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP