从一个文件中删除另一个文件中的内容

时间:2013-01-29 02:40:29

标签: linux shell unix command-line grep

我有两个文本文件,file1.txt和file2.txt。

file1.txt包含一个数字列表。 file2.txt还包含一个数字列表,但是它们中的更多(一个好的块是来自file1.txt的数字)。这就是我想要做的事情:

我想从file2.txt中删除file1.txt中的所有数字,并将输出保存到file3.txt。所以在file3.txt中,它不包含file1.txt中的数字。我怎么能做到这一点?

6 个答案:

答案 0 :(得分:4)

这是使用awk的一种方式:

awk 'FNR==NR { a[$0]; next } !($0 in a)' file1.txt file2.txt > file3.txt

这将file1读入一个数组,然后当迭代通过file2时,它将打印不在数组中的file2行并将它们写入输出文件。如果您有任何疑问,请不要犹豫。欢呼声。

答案 1 :(得分:2)

使用GNU grep,您可以使用“fgrep”模式:

grep -F -v -f file1.txt -w file2.txt > file3.txt

演示:

seq 1 30 > file2.txt
for i in 1 2 3 4 5; do echo $RANDOM; done | sed 's/\(..\).*/\1/' > file1.txt
grep -F -v -f file1.txt -w file2.txt > file3.txt

file2.txt的内容是数字1到30的行。file1.txt的内容是5个半随机的2位数字。 file3.txt中的输出是文件2中不在文件1中的行。请注意,循环生成的随机数不是很好,也不是约为1..30(另请参见下面的注释)。

特定于GNU grep的功能是-w标志,它与整个单词匹配。有趣的是,POSIX 2008指定-x应与精确行匹配,-x选项对我来说正常(在Mac OS X 10.7.5上,但/usr/bin/grep是GNU grep 2.5.1) 。从理论上讲,-x更具便携性。由于它也符合POSIX 1997标准,因此应广泛使用。如果一行中有多个数字,-w选项会更合适(但grep会消除整行)。

答案 2 :(得分:1)

sort file1.txt file2.txt|uniq -u > file3.txt

答案 3 :(得分:1)

您可以使用unix“diff”命令获取差异并过滤掉不需要的行。您可以使用 - 已更改组格式 - 未更改组格式选项来过滤所需数据。

以下三个选项可用于为每个选项选择相关组:

  • '%<'从FILE1获取行

  • '%>'从FILE2获取行

  • ''(空字符串)用于从两个文件中删除行。

e.g:

diff --changed-group-format="%>" --unchanged-group-format="" file1.txt file2.txt > file3.txt

答案 4 :(得分:0)

您能否提供一些有关如何格式化这些数字的更多信息?他们每个人都在新线上吗?它们的位数是否相同?

编辑:收到评论后:

while read line
do
    bool="false"
    while read secLine
    do
        if [ "$line" == "$secLine" ]
        then
            bool="true"
        fi
    done <file1
    if [ "$bool" == "false" ]
    then
         echo $line >> file3.txt
    fi
done <file2

这会起作用,虽然是暴力(或它应该有效。检查语法错误。我没有看到任何但可能有一些。)这可能需要一段时间取决于你有多少数字。

答案 5 :(得分:0)

您只想打印file2.txt的唯一元素。这就是comm实用程序的用途:

comm -13 <(sort file1.txt) <(sort file2.txt)

测试

$ cat file1.txt
5
4
6
2
10

$ cat file2.txt
3
7
8
2
4
1
9
10
5
6

$ comm -13 <(sort file1.txt) <(sort file2.txt)
1
3
7
8
9