求shell脚本,删除一个a.txt文档中 完全包含 另外一个b.txt文档的行。

根据第二个文档,删除第一文档中完全包含另外第二个文档的行。第一个文档的格式是“哈尔滨+tab符号+数字”。希望的结果是:求大神解答。... 根据第二个文档,删除第一文档中 完全包含 另外第二个文档的行。
第一个文档的格式是“哈尔滨+tab符号+数字”。
希望的结果是:

求大神解答。
展开
 我来答
shallowgrave
2013-09-23 · TA获得超过510个赞
知道小有建树答主
回答量:340
采纳率:0%
帮助的人:407万
展开全部
cat b.txt| xargs -I {} sed -i '/\<{}\>/d' a.txt

直接修改a.txt的话,那么可以按以上命令.命令解释一下:

显示b.txt,并重定向给xargs,xargs将每行锁定,然后每行执行删除匹配该字的行.

{}锁定的一行(一行一字), \<匹配字的开始, \>匹配字的结尾, d删除匹配行, i直接修改文件

缺点是直接将a.txt修改了.

如果不需要修改的话,那么就可以参考楼下的命令

grep -v -w "\<`cat b.txt`\>" a.txt

命令解释一下:

在a.txt中搜索不匹配cat 命令逐行(一字一行)显示的行.

-v 表示不匹配的, -w 按字匹配, \<匹配字的开始, \>匹配字的结尾

浦疏贤085
2013-09-23 · TA获得超过291个赞
知道答主
回答量:149
采纳率:100%
帮助的人:126万
展开全部

用这条命令应该能达到你的目的,你试试

grep -v -w "\<`cat b.txt`\>" a.txt


另外,你的b.txt里meiy哈尔滨,所以a.txt中的'哈尔滨    3'应该不会被删除。

追问
这个貌似不能完全匹配吧 ?
数据多的时候。输入 “北”"哈尔"
这样的话,也会过滤掉 "北京"“哈尔滨”"哈尔滨香坊"这样的
追答

上面已经给你解释了 -w就是精确匹配的意思。 \< \>是限定单词开头结尾的意思。

没有效果是因为匹配的是中文,匹配中文对字符编码格式有些要求。


你的字符编码是en_US.UTF-8吗?可以用locale看一下。

grep不行还是用上面的方法吧:

cat b.txt| xargs -I {} sed -i '/\<{}\>/d' a.txt
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
iFuniCat
2013-09-22 · 超过35用户采纳过TA的回答
知道答主
回答量:88
采纳率:0%
帮助的人:60.5万
展开全部
#! /bin/sh

while read LINE
do
grep -v ${LINE} a.txt > a.txt
done < b.txt
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式