中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-08 18:07
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 文本合并计算 查看 2,596 回复 18
楼 主 文本合并计算 发表于 2008-05-28 18:24 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
text1.txt

15600_20080525_01.p106_prt
15601 6 贷 -4341.00
15602 2 借 20245.00
15604 8 贷 -30310.00
15605 1 贷 -3000.00
15606 1 借 20.00
15607 3 贷 -2700.00
15608 1 贷 -20000.00
15609 9 借 57650.24
15610 4 借 68859.00
15611 1 贷 -780.00
15612 4 借 15540.00
15613 2 贷 -3895.00
15615 7 贷 -25560.00
15617 1 借 500.00
合计 50 借 72228.24

15601_20080525_prt
15600 4 贷 -91000.00
15602 4 贷 -65150.00
15604 5 借 4970.00
15605 2 借 7340.00
15606 2 借 1000.00
15607 2 借 900.00
15608 1 借 690.00
15609 1 借 970.00
15611 4 借 6800.00
15612 2 借 73500.00
15613 1 借 500.00
15615 3 借 2190.00
15616 1 贷 -105.00
合计 32 贷 -57395.00

text2.txt

15600_20080526_01.p106_prt
15601 9 借 44114.00
15604 25 贷 -295670.00
15605 2 借 303000.00
15606 2 贷 -10000.00
15607 1 借 45000.00
15608 2 借 10320.00
15609 2 借 526.00
15610 4 贷 -44560.00
15611 1 贷 -2300.00
15612 5 贷 -3250.00
15613 1 贷 -3003.00
15615 4 借 31800.00
15616 6 借 40990.00
合计 64 借 116967.00

15601_20080526_01.1a1_prt
15600 3 借 22900.00
15602 2 贷 -8000.00
15604 19 借 33560.00
15605 5 借 9053.00
15606 5 借 30247.03
15607 8 借 62750.00
15608 1 借 450.00
15609 3 贷 -390.00
15610 5 借 15600.00
15611 3 借 6400.00
15612 1 借 840.00
15613 2 借 28400.00
15615 3 贷 -48200.00
合计 60 借 153610.03


如何将text1.txt和text2.txt相同项目合并加总
得到
机构 笔数 借贷 金额
15600_prt
15601 15 借 39773
合计 * * *
......
......

注:
15601 6 贷 -4341.00
15601 9 借 44114.00
6+9=15
44114-4341=39773

注意:
15601
15602
...
15606
字段1数字可能不连续!!!


我把结果讲的不清楚!
是每月统计本机构代理其他机构的业务量
共16个机构
想得到:

1. 15600_200805
15601 * * *
15602 * * *
15604 * * *
15605 * * *
......
15617 * * *

2. 15601_200805
15600 * * *
15602 * * *
15604 * * *
15605 * * *
......
15617 * * *

3. 15602_200805
......
......


中间没有15603和15614


[ Last edited by xycoordinate on 2008-5-29 at 02:12 PM ]
2 发表于 2008-05-28 20:16 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
意思没有表达清楚:合并之后,借贷字段是写“借”还是“贷”呢?根据什么来判断?

这样的问题用 awk 来解决最适合不过了。
3 发表于 2008-05-28 21:01 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
正数是借……负是贷……

个人觉得有点像体力活=。=
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
4 发表于 2008-05-28 21:22 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
不知道这样如何?
# gawk --posix "$1~/^+$/{rec+=$NF;num+=$2;sum+=$NF;} END{printf(\"机构 笔数 借贷 金额\n\");for(t in rec){printf(\"%-10s%-10d%-10s%-10d\n\",t,num,rec>0?\"借\":\"贷\",rec);}}" text1.txt text2.txt
机构 笔数 借贷 金额
15613 6 借 22002
15604 57 贷 -287450
15605 10 借 316393
15615 17 贷 -39770
15606 10 借 21267
15616 7 借 40885
15607 14 借 105950
15617 1 借 500
15608 5 贷 -8540
15609 15 借 58756
15600 7 贷 -68100
15610 13 借 39899
15601 15 借 39773
15611 9 借 10120
15602 8 贷 -52905
15612 12 借 86630
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
xycoordinate +2 2009-04-03 06:41
5 发表于 2008-05-28 21:31 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线

正数是借……负是贷……

是这个意思!

要用awk???
不想倒到UNIX上去!!!



lxmxn斑竹:

有2个问题
A.机构没有排序
B.没有合计

[ Last edited by xycoordinate on 2008-5-28 at 10:03 PM ]
6 发表于 2008-05-28 21:55 ·  中国 陕西 西安 电信
铂金会员
★★★★
积分 5,212
发帖 2,478
注册 2007-02-08 23:39
19年会员
UID 79003
性别 男
状态 离线
有windows版的呀
S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
7 发表于 2008-05-28 22:35 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
下载个Windows版的吧

UnxUtils
http://upload.cn-dos.net/img/377.zip
8 发表于 2008-05-28 23:17 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
echo.机构      笔数      借贷      金额&&gawk --posix "$1~/^+$/{rec+=$NF;num+=$2;sum+=$NF;} END{for(t in rec){printf(\"%-10s%-10d%-10.2s%-10.2f\n\",t,num,rec>0?\"借\":\"贷\",rec);tnum+=num;trec+=rec} ;printf(\"合计:    %-10d%-10s%-10.2f\",tnum,trec>0?\"借\":\"贷\",trec)}" text1.txt text2.txt | sort


[ Last edited by lxmxn on 2008-5-28 at 11:19 PM ]
9 我日花了我两个小时写这个: 发表于 2008-05-28 23:23 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线

@echo off&setlocal enabledelayedexpansion
echo 机构 笔数 借贷 金额
for /l %%i in (15600,1,15617) do call :lp %%i
echo 合计 !bi! !借贷! !num!.00
pause>nul&goto :eof
:lp
for /f "tokens=1,2,3,4 delims= " %%i in (1.txt) do (
if %%i equ %1 (
set str1=%%i&set a=%%l&set a=!a:-=!&set a=!a:~,-3!
if "%%k" equ "贷" (
set /a str2+=%%j,str4-=!a!,bi+=%%j,num-=!a!
) else (
set /a str2+=%%j,str4+=!a!,bi+=%%j,num+=!a!
)
if !str4! leq 0 (
set str3=货
) else (
set str3=借
)
)
)
if defined str1 echo !str1! !str2! !str3! !str4!.00
set str1=&set str2=0&set str3=&set str4=0

注:echo 第一个字符串后的空格实际都是tab(按下tab键),而论坛处理不了tab
(只做空格处理),所以请楼主自己将复制后的代码中的空格改回tab!

1.txt:

15600_20080525_01.p106_prt
15601 6 贷 -4341.00
15602 2 借 20245.00
15604 8 贷 -30310.00
15605 1 贷 -3000.00
15606 1 借 20.00
15607 3 贷 -2700.00
15608 1 贷 -20000.00
15609 9 借 57650.24
15610 4 借 68859.00
15611 1 贷 -780.00
15612 4 借 15540.00
15613 2 贷 -3895.00
15615 7 贷 -25560.00
15617 1 借 500.00
合计 50 借 72228.24

15601_20080525_prt
15600 4 贷 -91000.00
15602 4 贷 -65150.00
15604 5 借 4970.00
15605 2 借 7340.00
15606 2 借 1000.00
15607 2 借 900.00
15608 1 借 690.00
15609 1 借 970.00
15611 4 借 6800.00
15612 2 借 73500.00
15613 1 借 500.00
15615 3 借 2190.00
15616 1 贷 -105.00
合计 32 贷 -57395.00
15600_20080526_01.p106_prt
15601 9 借 44114.00
15604 25 贷 -295670.00
15605 2 借 303000.00
15606 2 贷 -10000.00
15607 1 借 45000.00
15608 2 借 10320.00
15609 2 借 526.00
15610 4 贷 -44560.00
15611 1 贷 -2300.00
15612 5 贷 -3250.00
15613 1 贷 -3003.00
15615 4 借 31800.00
15616 6 借 40990.00
合计 64 借 116967.00

15601_20080526_01.1a1_prt
15600 3 借 22900.00
15602 2 贷 -8000.00
15604 19 借 33560.00
15605 5 借 9053.00
15606 5 借 30247.03
15607 8 借 62750.00
15608 1 借 450.00
15609 3 贷 -390.00
15610 5 借 15600.00
15611 3 借 6400.00
15612 1 借 840.00
15613 2 借 28400.00
15615 3 贷 -48200.00
合计 60 借 153610.03

附运行后的结果:

机构 笔数 借贷 金额
15600 7 货 -68100.00
15601 15 借 39773.00
15602 8 货 -52905.00
15604 57 货 -287450.00
15605 10 借 316393.00
15606 10 借 21267.00
15607 14 借 105950.00
15608 5 货 -8540.00
15609 15 借 58756.00
15610 13 借 39899.00
15611 9 借 10120.00
15612 12 借 86630.00
15613 6 借 22002.00
15615 17 货 -39770.00
15616 7 借 40885.00
15617 1 借 500.00
合计 206 285410.00


[ Last edited by zw19750516 on 2008-5-28 at 11:47 PM ]
批处理之家新域名:www.bathome.net
10 发表于 2008-05-29 01:39 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
也来一个,没计算后面的小数。
看楼上几位好像都没计算小数?
:

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1-4 delims= " %%a in (text1.txt text2.txt) do (
if not "%%d"=="" (
if not "%%a"=="合计" set "max=%%d"&set /a _%%a+=!max:~0,-3!,.%%a+=%%b
))
for /f "tokens=1,2 delims=.=" %%a in ('set .') do (
if !_%%a! lss 0 (set n=贷) else set n=借
set "m=%%b "&set /a str1+=%%b,str2+=!_%%a!
echo %%a !m:~0,3! !n! !_%%a!
)
if !str2! lss 0 (set n=贷) else set n=借
echo.&echo 合计: !str1! !n! !str2!
pause>nul
致精致简!
11 发表于 2008-05-29 02:03 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
如果有Perl的环境可以试试这个:
# perl -anle '
if($F=~/^\d+$/){
hash->{$F}->{"tot"}+=$F;
hash->{$F}->{"rec"}+=$F;
}
END{
print "机构 笔数 借贷 金额";
foreach(sort keys %hash){
hash->{"tot"}+=hash->{$_}->{"tot"};
hash->{"rec"}+=hash->{$_}->{"rec"};
printf("%-10s%-10d%-10s%-10.2f\n",$_,hash->{$_}->{"rec"},hash->{$_}->{"tot"}>0?"借":"贷",hash->{$_}->{"tot"})
}
printf("总计 %-10d%-10s%-10.2f\n",hash->{"rec"},hash->{"tot"}>0?"借":"贷",hash->{"tot"});
}'
text1.txt text2.txt

机构 笔数 借贷 金额
15600 7 贷 -68100.00
15601 15 借 39773.00
15602 8 贷 -52905.00
15604 57 贷 -287450.00
15605 10 借 316393.00
15606 10 借 21267.03
15607 14 借 105950.00
15608 5 贷 -8540.00
15609 15 借 58756.24
15610 13 借 39899.00
15611 9 借 10120.00
15612 12 借 86630.00
15613 6 借 22002.00
15615 17 贷 -39770.00
15616 7 借 40885.00
15617 1 借 500.00
总计 206 借 285410.27
#


[ Last edited by lxmxn on 2008-5-29 at 02:05 AM ]
12 发表于 2008-05-29 03:18 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
计算这个小数还真麻烦,到头来自己都不知道是怎么算的了。结果倒好像对了。

@echo off&setlocal enabledelayedexpansion
echo 机构 笔数 借贷 金额
echo.
for /f "tokens=1-5 delims=. " %%a in (a.txt b.txt) do (
if not "%%d"=="" (
if not "%%a"=="合计" (
set "max=%%d"&set /a _%%avar+=1,_%%anum+=1%%e
set /a _%%a+=max,.%%a+=%%b,hj+=1%%e,k+=1
)))
set /a k*=100,hj-=k
set hjw=!hj:~-2,2!&set "hj=!hj:~0,-2!"
if not defined hj set /a hj=0
for /f "tokens=1,2 delims=.=" %%a in ('set .') do (
set x=!_%%anum:~-2,2!
set /a _%%avar*=100,_%%anum-=_%%avar
set z=!_%%anum:~0,-2!
if not defined z set /a z=0
if !_%%a! lss 0 (set n=贷) else set n=借
set "m=%%b "&set /a str1+=%%b,str2+=!_%%a!,_%%a+=z
echo %%a !m:~0,3! !n! !_%%a!.!x!
set z=&set x=
)
if !str2! lss 0 (set n=贷) else set n=借
set /a str2+=hj
echo.&echo 合计: !str1! !n! !str2!.!hjw!
pause>nul
致精致简!
13 发表于 2008-05-29 08:18 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
感谢大家的热心帮助!

我得好好学习学习!!!

消化
14 发表于 2008-05-29 09:01 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
test.bat

echo.机构 笔数 借贷 金额&&gawk --posix "$1~/^+$/{rec+=$NF;num+=$2;sum+=$NF;} END{for(t in rec){printf(\"%-10s%-10d%-10.2s%-10.2f\n\",t,num,rec>0?\"借\":\"贷\",rec);tnum+=num;trec+=rec} ;printf(\"合计: %-10d%-10s%-10.2f\",tnum,trec>0?\"借\":\"贷\",trec)}" text1.txt text2.txt | sort

难道只能在CMD下执行,不能写成BAT吗?

E:\bdttdb>test.bat
机构 笔数 借贷 金额
gawk: cmd. line:1: $1~/^+$/{rec+=$NF;num+=$2;sum+=$NF;} END{for(t i
n rec){printf("-10d-10.2f\n",t,num,rec>0?"借":"贷",rec);tnum+=num;tr
ec+=rec} ;printf("合计: -10s"贷",trec)}
gawk: cmd. line:1:

^ invalid char '? in expression
15 发表于 2008-05-29 11:34 ·  中国 广东 韶关 电信
高级用户
★★★
CMD感染者
积分 691
发帖 383
注册 2008-05-23 00:38
18年会员
UID 119451
性别 男
状态 离线
这里的氛围真好!
努力学习.....
论坛跳转: