Board logo

标题: 文本合并计算 [打印本页]

作者: xycoordinate     时间: 2008-5-28 18:24    标题: 文本合并计算
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 ]

作者: lxmxn     时间: 2008-5-28 20:16
意思没有表达清楚:合并之后,借贷字段是写“借”还是“贷”呢?根据什么来判断? 这样的问题用 awk 来解决最适合不过了。

作者: slore     时间: 2008-5-28 21:01
正数是借……负是贷…… 个人觉得有点像体力活=。=

作者: lxmxn     时间: 2008-5-28 21:22
不知道这样如何?
# gawk --posix "$1~/^[0-9]+$/{rec[$1]+=$NF;num[$1]+=$2;sum+=$NF;} END{printf(\"机构 笔数 借贷 金额\n\");for(t in rec){printf(\"%-10s%-10d%-10s%-10d\n\",t,num[t],rec[t]>0?\"借\":\"贷\",rec[t]);}}" 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

作者: xycoordinate     时间: 2008-5-28 21:31
正数是借……负是贷……
是这个意思! 要用awk??? 不想倒到UNIX上去!!! lxmxn斑竹: 有2个问题 A.机构没有排序 B.没有合计 [ Last edited by xycoordinate on 2008-5-28 at 10:03 PM ]

作者: slore     时间: 2008-5-28 21:55
有windows版的呀

作者: HAT     时间: 2008-5-28 22:35
下载个Windows版的吧 UnxUtils upload.cn-dos.net/img/377.zip

作者: lxmxn     时间: 2008-5-28 23:17
echo.机构      笔数      借贷      金额&&gawk --posix "$1~/^[0-9]+$/{rec[$1]+=$NF;num[$1]+=$2;sum+=$NF;} END{for(t in rec){printf("%-10s%-10d%-10.2s%-10.2f\n",t,num[t],rec[t]>0?"借":"贷",rec[t]);tnum+=num[t];trec+=rec[t]} ;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 ]

作者: bat-zw     时间: 2008-5-28 23:23    标题: 我日花了我两个小时写这个:
@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 ]

作者: 26933062     时间: 2008-5-29 01:39
也来一个,没计算后面的小数。 看楼上几位好像都没计算小数? :
@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

作者: lxmxn     时间: 2008-5-29 02:03
如果有Perl的环境可以试试这个:
[root@xunizhuji dos]# perl -anle ' if($F[0]=~/^\d+$/){ hash->{$F[0]}->{"tot"}+=$F[3]; hash->{$F[0]}->{"rec"}+=$F[1]; } 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 [root@xunizhuji dos]#
[ Last edited by lxmxn on 2008-5-29 at 02:05 AM ]

作者: 26933062     时间: 2008-5-29 03:18
计算这个小数还真麻烦,到头来自己都不知道是怎么算的了。结果倒好像对了。
@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

作者: xycoordinate     时间: 2008-5-29 08:18
感谢大家的热心帮助! 我得好好学习学习!!! 消化

作者: xycoordinate     时间: 2008-5-29 09:01
test.bat
echo.机构 笔数 借贷 金额&&gawk --posix "$1~/^[0-9]+$/{rec[$1]+=$NF;num[$1]+=$2;sum+=$NF;} END{for(t in rec){printf(\"%-10s%-10d%-10.2s%-10.2f\n\",t,num[t],rec[t]>0?\"借\":\"贷\",rec[t]);tnum+=num[t];trec+=rec[t]} ;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~/^[0-9]+$/{rec[$1]+=$NF;num[$1]+=$2;sum+=$NF;} END{for(t i n rec){printf("-10d-10.2f\n",t,num[t],rec[t]>0?"借":"贷",rec[t]);tnum+=num[t];tr ec+=rec[t]} ;printf("合计: -10s"贷",trec)} gawk: cmd. line:1: ^ invalid char '? in expression

作者: radem     时间: 2008-5-29 11:34
这里的氛围真好! 努力学习.....

作者: xycoordinate     时间: 2008-5-29 13:55
发现我把结果讲的不清楚! 不是把所有的相同相加,而是分类相加 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 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 text1.txt中 15600_20080525_01.p106_prt 15601 6 贷 -4341.00 text1.txt中 15600_20080526_01.p106_prt 15601 9 借 44114.00 如果2个文本中有相同相加 得到: 15600_200805 15601 * * * 15602 * * * 15604 * * * 15605 * * * ...... 15617 * * * 15601_200805 15601 * * * 15602 * * * 15604 * * * 15605 * * * ...... 15617 * * * 中间没有15603和15614 [ Last edited by xycoordinate on 2008-5-29 at 02:04 PM ]

作者: xycoordinate     时间: 2008-5-29 20:40
作者: guilinljd     时间: 2008-5-30 00:28    标题: 先下了
试试好用不

作者: xycoordinate     时间: 2008-5-30 18:21
26933062 请问: ...... for /f "tokens=1,2 delims=.=" %%a in ('set .') do ( ...... set . 是什么意思???