QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 981|回复: 11

求文本比较 方案脚本

[复制链接]
发表于 2005-5-10 10:33:08 | 显示全部楼层 |阅读模式
我在 test目录下有n个文本文件 :sms-1-20050301000000.txt,sms-2-20050302000000.txt 等,还有一个文件为test.txt

其中每个文本文件的每一行都是一条记录,而test.txt中的记录为
12341324123
13243532131
54325341321
12332141325
我现在想从 sms-1-2005......这些文本文件中删除包含test.txt中相对应行记录的行,  请问这个shell 脚本怎么写,

---------------------------------------------
跪,急 求
发表于 2005-5-10 10:51:19 | 显示全部楼层
用一个for循环和grep 的-v -l选项应该可以搞定吧
我得做个测试先
回复

使用道具 举报

 楼主| 发表于 2005-5-10 10:55:54 | 显示全部楼层
谢谢大哥,
如果人工手动搞,会死人啊
-----------------------------------
我是菜鸟,但我想飞向蓝天
回复

使用道具 举报

发表于 2005-5-10 11:25:33 | 显示全部楼层
做了一个测试,成功了。
在你自己做测试之前请做一下备份,以免毁了数据。
[code:1]
#!/usr/local/bin/bash
# file : createfile.sh

for ((i=1;i<=4;i++))
do
        touch sms-$i.txt
done
[/code:1]
[code:1]
#!/usr/local/bin/bash
# file : match.sh

for line in $(cat test.txt)
do
        for filename in $(ls sms*.txt)
        do
                grep -il $line $filename>/dev/null
                case $? in
                        0) grep -v $line $filename>tempfile&&rm $filename&&mv tempfile $filename ;;
                        1) echo 'no match' ;;
                esac
        done
done
[/code:1]
第一个脚本createfile.sh是我用来生成你的那些sms-**.txt文件的, 你不需要。
第二个才是你需要的。
回复

使用道具 举报

发表于 2005-5-10 11:27:24 | 显示全部楼层
请把原来的数据做一下备份,然后再测试
破坏了数据俺可不负责的哟
回复

使用道具 举报

 楼主| 发表于 2005-5-10 12:13:45 | 显示全部楼层
感谢
--------------------------------
菜鸟起飞
回复

使用道具 举报

发表于 2005-5-10 12:25:41 | 显示全部楼层
能用不?
告诉我你的测试结果呀
回复

使用道具 举报

 楼主| 发表于 2005-5-10 12:27:12 | 显示全部楼层
我还在测试,你等等,大哥
回复

使用道具 举报

 楼主| 发表于 2005-5-10 13:01:25 | 显示全部楼层
MichaelBibby大哥还在不,我现在发现一个问题,就是如果有个sms文件中的记录和test中的记录都模糊匹配,那么你的程序就没有生成一个tempfile文件,同时也没有把相应的SMS文件删除,
请教大哥该怎么修改文件,
---------------------------
继续测试中
回复

使用道具 举报

发表于 2005-5-10 13:31:09 | 显示全部楼层
[quote:ba7171d470="xiaoyue8106"]如果有个sms文件中的记录和test中的记录都模糊匹配,那么你的程序就没有生成一个tempfile文件,同时也没有把相应的SMS文件删除[/quote]模糊匹配?
把你的要求说得更具体些呢?
回复

使用道具 举报

 楼主| 发表于 2005-5-10 14:02:45 | 显示全部楼层
sms文件中的记录只需包含test文件的记录就算满足,用grep就可以实现
大哥,我在你的目录下建一个目录new,刚才的问题(如果sms文件中的记录和test中记录全匹配,脚本就对该文件不作处理)就解决了,
我把你代码中的这句
grep -v $line $filename>tempfile&&rm $filename&&mv tempfile $filename ;;
改为
grep -v $line $filename>tempfile&&rm $filename&&mv tempfile ./new/filename ;;
不处理的文件留在原来位置,处理的文件移动到new目录下,不过现在又发现这么移动后,处理的结果有问题,脚本没有完全把所有相同记录删除,
-----------------------------------
实在想不出是什么问题,是不是我电脑有问题啊
回复

使用道具 举报

 楼主| 发表于 2005-5-10 14:22:10 | 显示全部楼层
调试基本上结束,发现问题就是
当sms文件和test文件全部匹配和全部不匹配的都没有进行处理,我把
              grep -il $line $filename>/dev/null
            改为  grep -i $line $filename>/dev/null(去掉l),还是没有处理全部不匹配        的     记录
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 00:24 , Processed in 0.056256 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表