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

Bash 将字符串从一个文件连接到另一个文件,无需重复,bash,Bash,有两个文本文件;文件A和文件B fileB包含必须附加到fileA的字符串,但是两个文件中可能已经存在一些字符串,我们不想添加重复的行 例如: 文件内容 文件内容 从文件B中,第5行和第6行将附加到文件A 我可以编写一个C/C++可执行文件来实现这一点,但我会从bash脚本调用它。那么,有没有一种相当简单的方法可以直接在bash中实现这一点 为了增加一点上下文,MacsOSX使用ASLAPLE系统日志代替标准的Linux系统日志。它有一个配置文件asl.conf,我们产品的安装程序会在该文件中添

有两个文本文件;文件A和文件B

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

例如:

文件内容

文件内容

从文件B中,第5行和第6行将附加到文件A

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


为了增加一点上下文,MacsOSX使用ASLAPLE系统日志代替标准的Linux系统日志。它有一个配置文件asl.conf,我们产品的安装程序会在该文件中添加行。如果配置中不存在新行,则更新必须从文件中添加新行。

这对您有用吗

$ cat fileA fileB | sort -u
注意:此方法可以更改行的顺序

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

#! /bin/sh
cat fileB | while read l; do
  ! grep -Fxq "$l" fileA && echo "$l" >> fileA
done
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!
}
-w与精确的直线相匹配

-v反转

-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$
awk一号班轮:

awk '/^ *$/ || !a[$0]++' fileA fileB > tmp.txt && mv tmp.txt fileA


看看awk。在awk中,重复数据消除行是一个单行程序,因此,关于这样做的问题很多。不过,您需要输出到第三个文件。您真的要删除空格吗?@choroba,假设您指的是第5行之间的空格,谢谢您指出,这是一个打字错误!如果fileA足够小,可以放在内存中,那么可以使用awk:awk'NR==FNR{a[$0];print;next}$a'fileA FileB中的0是一个字符串,但行是重要的。我刚刚编辑了答案,添加了一个解决方案,该解决方案保留了大部分行,但不保留行。相反,它在空白处分割,因此任何空格都会创建新行并添加所有行。即使进行了编辑,它也会添加第一个文件中已经存在的行。重复行的一个示例是?[A=Facility com.company.prog][太好了。谢谢。谢谢@choroba,但这也会复制行。复制行的示例是?[A=Facility com.company.prog][@TheDarkKnight:哦,你也想删除文件a的重复数据吗?那就检查一下更新。不完全是这样,我只是不想添加一行,如果它已经存在的话。@TheDarkKnight:我不明白。@TheDarkKnight:不,它写入标准输出,你可以重定向到一个文件而不是输入文件,不过:script.pl>output.txt。谢谢,但这是一个似乎什么都没做。你检查过文件1的内容吗?是的,没有变化。如果我重定向到一个带有“>”的单独文件,该文件也是空的。bash$grep-wvf file1 file2第5行6我得到了输出,我将其附加到文件1中。我想知道这是否是OS X的差异?你在Linux上运行这个吗?更新以匹配所有单独由zer组成的行o个或多个空格。正则表达式可以根据需要进行调整,以接受您所需的空行定义。我再次检查,它可以正常工作,但会添加许多额外的空格。无论是谁否决了答案,请礼貌地解释原因。
fgrep -wvf file1 file2 >> file1
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$
awk '/^ *$/ || !a[$0]++' fileA fileB > tmp.txt && mv tmp.txt fileA