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 <&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<&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