如何从unix文件中删除字符串

时间:2014-03-11 09:20:06

标签: shell unix sed awk

我有一个文件(Test1.txt),其中包含电子邮件地址:

abc@gmail.com
joe@yahoo.com

另一个文件(Test2.txt)中可能存在相同和一些额外的电子邮件地址,例如:

abc@gmail.com
gpg@gmail.com
joe@yahoo.com

我想删除Test2.txtabc@gmail.comjoe@yahoo.comTest1.txt)中的记录。 Test1.txtTest2.txt之间共有的记录应从Test2.txt中删除。我怎样才能做到这一点?

8 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed 's/[]^$.*&[]/\\&/g;s|.*|/^&$/d|' file1 | sed -f - file2

这将生成file1的sed脚本,以对file2进行处理。

答案 1 :(得分:1)

awk 'FNR==NR{a[$0];next}{if(!($0 in a)){print}' test1 test2

或简单地说:

awk 'FNR==NR{a[$0];next}!($0 in a)' test1 test2

答案 2 :(得分:0)

它不是那么简单,命令行不是SQL。一个简单的(虽然有点脏)解决方法:

cat Test1.txt Text2.txt Text2.txt|sort|uniq -c|awk '{if ($1==2) print $2;}'

这是正确的,假设电子邮件在每个文件中最多出现一次,假设不一定正确。

答案 3 :(得分:0)

这不是grep的任务吗?

grep -Fwvf test1.txt test2.txt

答案 4 :(得分:0)

得到公共线:

sort test1.txt test2.txt | uniq -d > common.txt

从test2.txt获取不是double的行(不是common.txt的内容)

sort common.txt test2.txt | uniq -u  > newtest2.txt

答案 5 :(得分:0)

如果文件已排序,则可以使用join命令:

join -v 1 Test2.txt Test1.txt

join对输入行,-v 1删除与第二个文件匹配的行。

如果它们没有排序,您可以使用sort进行预处理:

sort Test1.txt > Text1.txt.sorted # and similarly for the second file

并在已排序的文件上运行连接。

答案 6 :(得分:0)

你能试试这个。

grep -xvf test1 test2 > test | cp test test2

按照你的要求工作,但我怀疑它是否有效!

答案 7 :(得分:0)

你能试试这个:

grep -xvf test1 test2 > test|mv test test2 

按照您的要求工作,但怀疑它是否有效!