将字符串从一个文件连接到另一个文件,无需重复

时间:2015-08-04 14:35:32

标签: bash

有两个文本文件; fileA fileB

fileB 包含必须附加到 fileA 的字符串,但两个文件中可能已存在某些字符串,我们不想添加重复的行

例如:

  

fileA内容

Line 1
Line 2
Line 3
Line 4
  

fileB内容

Line 2
Line 5
Line 6

fileB 第5行第6行将附加到 fileA

我可以编写一个C / C ++可执行文件来执行此操作,但我会从bash脚本中调用它。那么,有一种相当简单的方法可以直接在bash中执行此操作吗?

要添加一些上下文,Macs OS X使用ASL(Apple System Log)代替标准Linux Syslog。它有一个配置文件(asl.conf),我们的产品安装程序将行添加到此文件中。更新必须添加文件中的新行,如果它们不存在于配置中。

4 个答案:

答案 0 :(得分:1)

这对你有用吗?

$ cat fileA fileB | sort -u

注意:此方法可以更改行的顺序。

要保留行的顺序,您可以执行以下操作:

#! /bin/sh
cat fileB | while read l; do
  ! grep -Fxq "$l" fileA && echo "$l" >> fileA
done

答案 1 :(得分:1)

Perl解决方案:

#!/usr/bin/perl
use warnings;
use strict;

my %seen;
open my $A, '<', 'fileA' or die $!;
while (<$A>) {                    # Read line by line.
    print;                        # Print all lines from fileA.
    chomp;                        # Remove the trailing newline.
    $seen{$_} = 1;                # Remember the line.
}

open my $B, '<', 'fileB' or die $!;
while (<$B>) {
    chomp;
    print $_, "\n" unless $seen{$_}; # Print only if not seen!
}

答案 2 :(得分:1)

fgrep -wvf file1 file2 >> file1

-w匹配确切的行。

-v invert。

-f匹配文件

bash$ cat file1
Line 1
Line 2
Line 3
Line 4
bash$ cat file2
Line 2
Line 5
Line 6

bash$ grep -wvf file1 file2
Line 5
Line 6
bash$

答案 3 :(得分:0)

Column 6单行:

awk