Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 区分两个文件,只保留新的或更改的行_File_Bash_Diff - Fatal编程技术网

File 区分两个文件,只保留新的或更改的行

File 区分两个文件,只保留新的或更改的行,file,bash,diff,File,Bash,Diff,我想写一个bash脚本或几个shell命令来解决我的问题。我有两个文件,old.txt和new.txt。我想生成一个文件diff.txt,其中只包含已更改或新的行。例如,如果我有: old.txt: Sierra Tango Oscar Victor Whiskey Yankee new.txt: Sierra Tango Echo Osc__ar Victor Uniform Whiskey Yan__kee 我想要一个像这样的diff.txt: Echo Osc__ar Uniform

我想写一个bash脚本或几个shell命令来解决我的问题。我有两个文件,old.txt和new.txt。我想生成一个文件diff.txt,其中只包含已更改或新的行。例如,如果我有:

old.txt:

Sierra
Tango
Oscar
Victor
Whiskey
Yankee
new.txt:

Sierra
Tango
Echo
Osc__ar
Victor
Uniform
Whiskey
Yan__kee
我想要一个像这样的diff.txt:

Echo
Osc__ar
Uniform
Yan__kee

从长远来看,我写这个脚本是为了帮助我创建一个差分Motorolla S2记录,以便通过串行端口将程序加载到嵌入式计算机。我对bash非常了解,只是不知道从哪里开始。

下面是如何使用
diff
仅显示新行和更改行:

$ grep -v -f old.txt new.txt
Echo
Osc__ar
Uniform
Yan__kee
$ cat file.txt file2.txt 
line 1
line 2
line 3
line 4
line 5
line 5
$ cat file2.txt 
line 1
line 2
line 3
line 4b
line 5
line 6

$  diff --changed-group-format='***%>' --unchanged-group-format='' --new-group-format='+++%>' file.txt file2.txt
***line 4b
+++line 6

真棒,这是可行的,但是如果任何一个文件都有空行,那么输出是空的。另外,对于我想要区分的完整文件,我得到了“grep:Invalid back reference”@portforwardpodcast您的旧文件中有任何可以解释为正则表达式的内容吗?是的,我完全有。大量的斜杠、开头和圆点等。我认为awk是我的选择:)你也可以使用-F标志表示grep-它可以忽略任何正则表达式,因此斜杠/圆点等将被视为纯文本。总的来说,你会得到'grep-F-v-F old.txt new.txt',这看起来很漂亮,但与其他版本相比,它会为大文件消耗大量的CPU/RAM。这个答案持续了两分钟多,在我使用它之前,我在一个30k行文件上大口大口大口大口大口地嚼着,结果烧掉了很多100MB的内存。相比之下,awk答案只需不到一秒钟的时间,这是一个可以处理大型文件的答案(在我的例子中是30k行);grep答案消耗了太多的资源。
$ cat file.txt file2.txt 
line 1
line 2
line 3
line 4
line 5
line 5
$ cat file2.txt 
line 1
line 2
line 3
line 4b
line 5
line 6

$  diff --changed-group-format='***%>' --unchanged-group-format='' --new-group-format='+++%>' file.txt file2.txt
***line 4b
+++line 6