Chinaunix

标题: 文件修改 [打印本页]

作者: hwhcom    时间: 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        |
作者: GM    时间: 2003-02-26 16:30
标题: 文件修改
呵呵,这个红袖添香最拿手,他(她)可以用awk,sed能回答你,等到晚上你可以得到答案了,不要急,因为我也不会,正好也可以学习学习!!!
作者: hwhcom    时间: 2003-02-26 17:16
标题: 文件修改
^_^!!!!!
作者: didikei    时间: 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],"";
}'
作者: biansj    时间: 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

献丑了,红香应该有更好的!
作者: 红袖添香    时间: 2003-02-27 00:06
标题: 文件修改
...


呵呵,GM 给我布置作业,biansj 给我压力~
作者: 红袖添香    时间: 2003-02-27 00:32
标题: 文件修改
...

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

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

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

biansj 忠实原著,但是因为 while 循环嵌套,不适合记录量很大的情况,我测试了一下各300条记录的情况,didikei 的用了7秒钟,biansj 的用两个小时还没完,只好CTRL-C中断, 呵呵。(不过也不排除可能是由于死循环了)
作者: hwhcom    时间: 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
作者: hwhcom    时间: 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
作者: didikei    时间: 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/[^|]*|//"

有点繁,你慢慢看.
作者: hwhcom    时间: 2003-02-27 13:34
标题: 文件修改
ok!thanks
作者: hwhcom    时间: 2003-02-27 13:35
标题: 文件修改
ok!thanks
作者: biansj    时间: 2003-02-27 14:05
标题: 文件修改
我的是死循环,我没有判断fileb结束的时候。

老了,不中用了。   
作者: hwhcom    时间: 2003-02-27 14:50
标题: 文件修改
借鉴各位高人的想法,俺写了一个:
awk '
BEGIN {
        FS="|";
        while (getline < "zcj"{
                d[$1] = 1;
                fee[$1]=$2;
        }
}
{
        #print d[$1]" "$1" "
        if (d[$1] == 1){
                for(i=1;i<NF;i++){
                        printf "%s|",$i;
                        if($i==4010){
                                i++;
                                printf "%-14.14s|",fee[$1];
                        }
                        if(i==NF-1) print ""
                }
        }
}' zcj1
作者: hwhcom    时间: 2003-02-27 15:07
标题: 文件修改
借鉴各位高人的想法,俺写了一个:
awk '
BEGIN {
        FS="|";
        while (getline < "zcj"{
                d[$1] = 1;
                fee[$1]=$2;
        }
}
{
        #print d[$1]" "$1" "
        if (d[$1] == 1){
                for(i=1;i<NF;i++){
                        printf "%s|",$i;
                        if($i==4010){
                                i++;
                                printf "%-14.14s|",fee[$1];
                        }
                        if(i==NF-1) print ""
                }
        }
}' zcj1
作者: hwhcom    时间: 2003-02-27 15:21
标题: 文件修改
借鉴各位高人的想法,俺写了一个:
awk '
BEGIN {
        FS="|";
        while (getline < "zcj"{
                d[$1] = 1;
                fee[$1]=$2;
        }
}
{
        #print d[$1]" "$1" "
        if (d[$1] == 1){
                for(i=1;i<NF;i++){
                        printf "%s|",$i;
                        if($i==4010){
                                i++;
                                printf "%-14.14s|",fee[$1];
                        }
                        if(i==NF-1) print ""
                }
        }
}' zcj1
作者: 红袖添香    时间: 2003-02-28 01:47
标题: 文件修改
...

呵呵,好!
作者: 红袖添香    时间: 2003-02-28 02:01
标题: 文件修改
...

只不过没执行成……

我这缺输入文件   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2