免费注册 查看新帖 |

Chinaunix

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

文件修改 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-26 15:25 |只看该作者 |倒序浏览
有两个文件:filea,fileb
filea:
11 0
22 200
......
fileb:
121|20030101|20030131|109|100.00        |4010|100.00        |
11 |20030101|20030131|19 |100.00        |4010|100.00        |4011|100.00        |
22 |20030101|20030131|990|100.00        |4010|300.00        |

用filea文件的第二个域值去修改fileb文件中的4010后的数值,且filea与fileb的第一个域相同,如果为0,把4010删除
新文件为:
121|20030101|20030131|109|100.00        |4010|100.00        |
11 |20030101|20030131|19 |100.00        |4011|100.00        |
22 |20030101|20030131|990|100.00        |4010|200.00        |

论坛徽章:
0
2 [报告]
发表于 2003-02-26 16:30 |只看该作者

文件修改

呵呵,这个红袖添香最拿手,他(她)可以用awk,sed能回答你,等到晚上你可以得到答案了,不要急,因为我也不会,正好也可以学习学习!!!

论坛徽章:
0
3 [报告]
发表于 2003-02-26 17:16 |只看该作者

文件修改

^_^!!!!!

论坛徽章:
0
4 [报告]
发表于 2003-02-26 18:13 |只看该作者

文件修改

cat  filea fileb | sort +0 | awk '
BEGIN {FS="|";OFS="|"}
{ if ($0 !~ /|/ )
      split($0,replace," ";
   else if ( $1 != replace[1] )
      print
   else if (replace[2]==0)
      print $1,$2,$3,$4,$5,$8,$9,"";
   else
      print $1,$2,$3,$4,$5,$6,replace[2],"";
}'

论坛徽章:
0
5 [报告]
发表于 2003-02-26 18:15 |只看该作者

文件修改

#!/usr/bin/ksh
exec 3<filea
exec 4<fileb
while read key value
do
    while :
    do
        read  line <&amp;4
        echo $line | awk -F'|' -vkey=$key '{print $1}' | read col1
        if [ "$key" = "$col1" ]
        then
            echo $line | awk -F'|' -vkey=$key -vvalue=$value '{
                if(value==0)
                    printf("%s|%s|%s|%s|%s|%s|%s|\n",$1,$2,$3,$4,$5,$(NF-2),$(NF-1));
                else
                    printf("%s|%s|%s|%s|%s|%s|%.2f |\n",$1,$2,$3,$4,$5,$6,value);
            }'
            break
        else
            echo $line
        fi
    done
done<&amp;3

献丑了,红香应该有更好的!

论坛徽章:
0
6 [报告]
发表于 2003-02-27 00:06 |只看该作者

文件修改

...


呵呵,GM 给我布置作业,biansj 给我压力~

论坛徽章:
0
7 [报告]
发表于 2003-02-27 00:32 |只看该作者

文件修改

...

两个都工作。我比较倾向 didikei 的。

呵呵,请允许我提点小意见,两个都稍有点美中不足。:P

didikei 的唯一缺憾是改变了 fileb 原来的顺序。

biansj 忠实原著,但是因为 while 循环嵌套,不适合记录量很大的情况,我测试了一下各300条记录的情况,didikei 的用了7秒钟,biansj 的用两个小时还没完,只好CTRL-C中断, 呵呵。(不过也不排除可能是由于死循环了)

论坛徽章:
0
8 [报告]
发表于 2003-02-27 09:44 |只看该作者

文件修改

[quote]原帖由 "didikei"]}'[/quote 发表:


上次忘了说,4010项的位置是不定的,例如
xxxxxxxxxxx |20030101|20030131|366       |343.16        |1001|50.96         |2001|92.20         |4010|200.00
     |
xxxxxxxxxxx |20030101|20030131|387       |513.40        |1001|50.96         |2001|276.60        |2002|36.00
     |2003|167.19        |2006|8.10          |4001|3.15          |4002|3.20          |4006|0.70          |4010|
200.00        |5001|67.50         |7002|-300.00       |
xxxxxxxxxxx |20030101|20030131|1761      |845.51        |1001|50.96         |2001|260.50        |2002|33.80
     |2003|31.29         |2004|121.60        |2007|54.00         |3003|10.00         |4001|67.36         |4010|
200.00        |5001|16.00         |

该如何print

论坛徽章:
0
9 [报告]
发表于 2003-02-27 09:56 |只看该作者

文件修改

[quote]原帖由 "didikei"]}'[/quote 发表:


上次忘了说,4010项的位置是不定的,例如
xxxxxxxxxxx |20030101|20030131|366       |343.16        |1001|50.96         |2001|92.20         |4010|200.00
     |
xxxxxxxxxxx |20030101|20030131|387       |513.40        |1001|50.96         |2001|276.60        |2002|36.00
     |2003|167.19        |2006|8.10          |4001|3.15          |4002|3.20          |4006|0.70          |4010|
200.00        |5001|67.50         |7002|-300.00       |
xxxxxxxxxxx |20030101|20030131|1761      |845.51        |1001|50.96         |2001|260.50        |2002|33.80
     |2003|31.29         |2004|121.60        |2007|54.00         |3003|10.00         |4001|67.36         |4010|
200.00        |5001|16.00         |

该如何print

论坛徽章:
0
10 [报告]
发表于 2003-02-27 12:50 |只看该作者

文件修改

1.#cat  t.awk
{
if(NF==2) split($2,replace," ";
else if($2 != replace[1]) print
else
for ( i=1; i<NF; i++) {
printf "%s|",$i;
if($i==4010) {i++; printf "%s|",replace[2];}
if(i==NF-1) print "";
}
}

2.#cat t.sh
cat filea fileb | nl -s "|" | sort -t"|" +1 \
| awk -F"|" -f t.awk | sort -n +0 \
| sed -e "s/|4010|0|/|/" -e "s/[^|]*|//"

有点繁,你慢慢看.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP