Chinaunix

标题: 如何删除2个文本中相同的数据 [打印本页]

作者: vkqo    时间: 2013-07-07 15:43
标题: 如何删除2个文本中相同的数据
比如
a.txt
123456
111111
233331
123333


b.txt
aabeef
311322
355552
123456

删除生成的c.txt(把2个文本相同的123456删除了)为
111111
233331
123333
aabeef
311322
355552

我用的是这个,但是每次要把a文本和b文本放到一起,才可以,有没有不用把a.txt和b.txt放在一起,直接能比较2个文件,删除,生成另外一个文本
sort a.txt |uniq -u >c.txt
作者: 关阴月飞    时间: 2013-07-07 16:11
本帖最后由 关阴月飞 于 2013-07-07 16:13 编辑
  1. sort  a.txt b.txt|uniq -u
复制代码
  1. awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}' a.txt b.txt
复制代码

作者: vkqo    时间: 2013-07-07 16:28
谢谢楼上的
作者: vkqo    时间: 2013-07-07 16:31
sort好像不行,提示:输入文件指定了两次。
作者: 关阴月飞    时间: 2013-07-07 16:59
回复 4# vkqo


    额,我在LINUX上是可行的,如果直接SORT两个文件不行,就这样吧:
  1. cat a.txt b.txt |sort |uniq -u
复制代码

作者: 357749340    时间: 2013-07-07 21:19
直接两个文本没试过
作者: 心若寒江雪    时间: 2013-07-08 09:43
uniq -u 可以
作者: mmwobuaini    时间: 2013-07-08 12:55
关阴月飞 发表于 2013-07-07 16:11


请问,我想知道下面代码中,a b文件执行过程是怎么样的?
  1. awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}' a.txt b.txt
复制代码
{a[$0]++}是先读取a完后 读取b 完后 执行end后语句?
作者: 关阴月飞    时间: 2013-07-08 12:59
回复 8# mmwobuaini


{a[$0]++}是先读取a完后 读取b 完后 执行end后语句, 就是这样的。

   
作者: wenhq    时间: 2013-07-08 14:03
diff file1 file2  也可以吧?
作者: wenhq    时间: 2013-07-08 14:11
本帖最后由 wenhq 于 2013-07-08 14:13 编辑

#!/usr/bin/perl

use strict;
use warnings;

$\="\n";

open my $fh1, '<', 'file1' or die $!;
open my $fh2, '<', 'file3' or die $!;
open my $out, '>', 'file3' or die $!;

chomp(my @arr1=<$fh1>);
chomp(my @arr2=<$fh2>);

foreach my $x  (@arr1){
     print $out $x if (!grep (/^\Q$x\E$/,@arr2));
}

close $fh1;
close $fh2;
close $out;



add perl hash solution

use strict;
use warnings;

my %exclude;

open my $fh, '<', 'text2.txt' or die $!;
while (<$fh>) {
  chomp;
  $exclude{$_}++;
}

open $fh, '<', 'text1.txt' or die $!;
while (<$fh>) {
  chomp;
  print "$_\n" unless $exclude{$_};
}




作者: wang1352083    时间: 2013-07-08 15:30
diff 怎么输出呢成规范文本呢?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2