求文本比较 方案脚本
我在 test目录下有n个文本文件 :sms-1-20050301000000.txt,sms-2-20050302000000.txt 等,还有一个文件为test.txt其中每个文本文件的每一行都是一条记录,而test.txt中的记录为
12341324123
13243532131
54325341321
12332141325
我现在想从 sms-1-2005......这些文本文件中删除包含test.txt中相对应行记录的行,请问这个shell 脚本怎么写,
---------------------------------------------
跪,急 求 用一个for循环和grep 的-v -l选项应该可以搞定吧
我得做个测试先 谢谢大哥,
如果人工手动搞,会死人啊
-----------------------------------
我是菜鸟,但我想飞向蓝天 做了一个测试,成功了。
在你自己做测试之前请做一下备份,以免毁了数据。
#!/usr/local/bin/bash
# file : createfile.sh
for ((i=1;i<=4;i++))
do
touch sms-$i.txt
done
#!/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
第一个脚本createfile.sh是我用来生成你的那些sms-**.txt文件的, 你不需要。
第二个才是你需要的。 请把原来的数据做一下备份,然后再测试
破坏了数据俺可不负责的哟 :mrgreen: 感谢
--------------------------------
菜鸟起飞 能用不?
告诉我你的测试结果呀 :x 我还在测试,你等等,大哥 MichaelBibby大哥还在不,我现在发现一个问题,就是如果有个sms文件中的记录和test中的记录都模糊匹配,那么你的程序就没有生成一个tempfile文件,同时也没有把相应的SMS文件删除,
请教大哥该怎么修改文件,
---------------------------
继续测试中 如果有个sms文件中的记录和test中的记录都模糊匹配,那么你的程序就没有生成一个tempfile文件,同时也没有把相应的SMS文件删除模糊匹配?
把你的要求说得更具体些呢? 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目录下,不过现在又发现这么移动后,处理的结果有问题,脚本没有完全把所有相同记录删除,
-----------------------------------
实在想不出是什么问题,是不是我电脑有问题啊 调试基本上结束,发现问题就是
当sms文件和test文件全部匹配和全部不匹配的都没有进行处理,我把
grep -il $line $filename>/dev/null
改为grep -i $line $filename>/dev/null(去掉l),还是没有处理全部不匹配 的 记录
页:
[1]