[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
原帖由 CUer 于 2010-5-5 21:26 发表
gawk -F"\t" "($1!=p+1)||(!($2 in a)){a[$2];print $1,$2}{p=$1}" data.txt >jingjian.txt
gawk "NR==FNR{a[$2]=$1}NR>FNR{print a[$2],$1}" jingjian.txt quhao.txt >result.txt


回复30楼:纠正一下,运行后jingjian.txt和data.txt完全一样,而result.txt与之前的几段代码结果相同

[ 本帖最后由 jack1505 于 2010-5-5 22:51 编辑 ]

TOP

你是不是把\t前面的空格丢掉了?

TOP

原帖由 CUer 于 2010-5-5 22:26 发表
你是不是把\t前面的空格丢掉了?


没有去掉空格,完全是复制粘贴过去的
论坛中的引用会再次省略一些符合,所以没了空格

30楼的代码运行后很奇怪,jingjian.txt变成与data.txt一样的文件了

其实我很期待gawk的处理速度,hanyeguxing的代码已经能输出非常接近的结果了,只是速度慢

[ 本帖最后由 jack1505 于 2010-5-5 22:52 编辑 ]

TOP

  1. type data.txt | gawk -F"[ \t]" "($1!=p+1)||(!($2 in a)){a[$2];print $1,$2}{p=$1}" >jingjian.txt
  2. gawk "NR==FNR{a[$2]=$1}NR>FNR&&($2 in a){print a[$2],$1}" jingjian.txt quhao.txt >result.txt
复制代码

TOP

原帖由 CUer 于 2010-5-5 23:08 发表
type data.txt | gawk -F"[ \t]" "($1!=p+1)||(!($2 in a)){a[$2];print $1,$2}{p=$1}" >jingjian.txt
gawk "NR==FNR{a[$2]=$1}NR>FNR&&($2 in a){print a[$2],$1}" jingjian.txt quhao.txt >result.txt


这么晚还没睡啊!感动ing……

说实话非常感谢CUer和hanyeguxing两位大力的帮助,虽然没有成功,但已经很接近了

麻烦CUer仔细看一下我修改补充的1楼的帖子,应该说的很详细了
最后的结果应该是从小到大连续排列的,并且文件大于500KB

TOP

  1. type data.txt | gawk -F"[ \t]" "($1!=p+1)||(!($2 in a)){a[$2];print $1,$2}{p=$1}" >jingjian.txt
  2. gawk "NR==FNR{a[$2]=$1}NR>FNR&&($2 in a){print $1,a[$2]}" quhao.txt jingjian.txt >result.txt
复制代码
不知道你为什么认为大于500KB才正常,我这个代码得到的结果大于9KB,你能否帮忙指出哪行数据丢掉了?

TOP

先排序data.txt到data1.txt
再把quhao.txt的内容定义到变量
最后读data1.txt取同区的第一个显示出来
注意:用for /f 命令处理文本时,默认是以空格和[Tab]同时作为字段分隔符的
  1. @echo off&setlocal enabledelayedexpansion
  2. sort data.txt /o data1.txt
  3. for /f "tokens=1-2" %%a in (quhao.txt) do set %%b=%%a
  4. (
  5. for /f "tokens=1-2" %%a in (data1.txt) do (
  6.     if "!var!" neq "%%b" (
  7.         echo;%%a !%%b!
  8.         set var=%%b
  9. ))
  10. )>结果.txt
复制代码

[ 本帖最后由 netbenton 于 2010-5-6 00:13 编辑 ]

TOP

回复36楼CUer

首先,jingjian.txt和result.txt的行数应该一直,因为result.txt只是替换了区号代码

其次,经我输出测试对比jingjian.txt和data.txt
发现第11行就少了这些数据:
1300025        江苏南京
1300027        山东烟台
1300028        江苏南京

另外,文件大于500KB是有依据的(手机号码从1300000~1899999,除部分地区外,基本每个地区10行,quhao.txt中共有336个地区)
hanyeguxing的代码已经可以正确精简数据了,只是输出顺序有误、速度慢,其结果为633KB

TOP

  1. type data.txt | gawk -F"[ \t]" "($1!=p1+1)||(p2!=$2){a[$2];print $1,$2}{p1=$1;p2=$2}" >jingjian.txt
  2. gawk "NR==FNR{a[$2]=$1}NR>FNR&&($2 in a){print $1,a[$2]}" quhao.txt jingjian.txt >result.txt
复制代码
这样可以得到大于500KB的文件,你把这个结果跟37楼大于600KB的比较一下,看看到底需要哪个。

TOP

原帖由 netbenton 于 2010-5-6 00:08 发表
先排序data.txt到data1.txt
再把quhao.txt的内容定义到变量
最后读data1.txt取同区的第一个显示出来
注意:用for /f 命令处理文本时,默认是以空格和[Tab]同时作为字段分隔符的
@echo off&setlocal enabledelaye ...


37楼netbenton版主正解!
输出正确、速度较快,要说完美只差不能显示进度(但也不影响使用)

原始数据data.txt本身就是从小到大连续排列的,不需要再排序了
可以精简sort命令行,提高速度!

非常感谢“批处理之家”的热心高手,这里氛围真好!

TOP

如果要求jingjian.txt和result.txt行数一样的话(50046行),可以这样做:
  1. type data.txt | gawk -F"[ \t]" "($1!=p1+1)||(p2!=$2){a[$2];print $1,$2}{p1=$1;p2=$2}" >jingjian.txt
  2. gawk "NR==FNR{a[$2]=$1}NR>FNR{if($2 in a)print $1,a[$2];else print $1}" quhao.txt jingjian.txt >result.txt
复制代码

TOP

  我的思路与37楼netbenton不谋而合,耗时约1分钟,结果应该是50023条记录,619.5K大小,不过貌似部分号段在quhao.txt中没有对应的区域,处理结果请看附件,不知道和楼主所要的结果有何差别。

  要想看到处理进程,请用这个代码:
  1. @echo off
  2. set t=%time%
  3. for /f "tokens=1,2" %%i in (quhao.txt) do set %%j=%%i
  4. setlocal enabledelayedexpansion
  5. (for /f "tokens=1,2" %%i in (data.txt) do (
  6.     echo %%i %%j>con
  7.     if not "%%j"=="!address!" (
  8.         echo %%i !%%j!
  9.         set address=%%j
  10.     )
  11. ))>result.txt
  12. start result.txt
  13. echo %t%
  14. echo %time%
  15. pause
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

37楼得到的结果是50023行,41楼得到的结果是50046行,到底哪个是正确的?

TOP

41楼比37楼多出如下行:
1349320 10
1349380 10
1349740 10
1349970 10
1380050
1380062 592
1534346 354
1534666
1534967 951
1535255 999
1536280 769
1536380 757
1536545 516
1555950 595
1572220 22
1860100 10
1861800 10
1863900 371
1879637 516
1880944 931
1881100 10
1887888 771
1893893 755

根据楼主的规则,这些行是需要保留下来的吗?

TOP

回复44楼

多出的数据应该无用

因为这些数据前后虽然不是相差1,但归属均相同,也可视为连续的数据

比如多出的“1349320”,前面的“1349299”和后面的“1349321”均为相同归属地“北京”

[ 本帖最后由 jack1505 于 2010-5-6 01:14 编辑 ]

TOP

返回列表