Sed 比较两个相似的文件,只输出差异,保留它们出现的顺序?

Sed 比较两个相似的文件,只输出差异,保留它们出现的顺序?,sed,diff,comm,Sed,Diff,Comm,希望有人能帮我解决这个问题 我有两个文件,一个325行,一个361行 这些文件的大部分内容相同,但第二个文件插入了随机的额外行。我只对额外的行感兴趣,我需要保留它们在文件中出现的顺序 这些文件包含一个大约31行的重复段落-我知道这段的第一行和最后一行,删除整个段落没有问题,但无法确定如何删除 i、 e.文件1 The quick brown fox jumped over the lazy dog The quick brown fox jumped over the lazy dog The

希望有人能帮我解决这个问题

我有两个文件,一个325行,一个361行

这些文件的大部分内容相同,但第二个文件插入了随机的额外行。我只对额外的行感兴趣,我需要保留它们在文件中出现的顺序

这些文件包含一个大约31行的重复段落-我知道这段的第一行和最后一行,删除整个段落没有问题,但无法确定如何删除

i、 e.文件1

The quick brown
fox jumped 
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog
The quick brown
fox jumped
over the
lazy dog
i、 e.文件2

The quick brown
fox jumped
over the
lazy dog
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
The quick brown
fox jumped
over the
lazy dog
djakdjhgmv
asdjkljkgfyiyi
The quick brown
fox jumped
over the
lazy dog
jghytpuptou
我只需要按以下顺序输出额外的行:

sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
任何帮助或建议都将得到感激,我不是一个*尼克斯人不幸的是:(
我尝试了一些diff表达式和comm表达式,但无法获得所需的内容。

试试这个神奇的命令:

diff file1.txt file2.txt | sed -n 's/^> \(.*\)/\1/p'
diff file1.txt file2.txt
应输出如下内容

2c2
< fox jumped 
---
> fox jumped
4a5,7
> sadhasdgh
> qyyutrytkdaslksad
> utyiuiytiuyo
8a12,13
> djakdjhgmv
> asdjkljkgfyiyi
12a18
> jghytpuptou
2c2
狐狸跳了起来
---
>狐狸跳了起来
4a5,7
>萨哈斯德格
>qyyutrytkdaslksad
>乌蒂尤约
8a12,13
>DJAKHGMV
>asdjlkfyiyiyi
12a18
>JGhytputou
sed-n的/^>\(.*)/\1/p'
应该找到以
开头的行,并输出那些没有
的行。这不起作用的可能原因是系统中不同的diff输出?

这应该起作用-

awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
解释:

[jaypal:~/Temp] awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
NR
FNR
awk的内置变量
NR
注册记录数,在处理两个文件时不会重置为
0
FNR
NR
类似,但在文件完全解析后会重置为
0

在这个
awk
一行程序中,我们保持条件
NR==FNR
,即只在文件1上强制操作
{a[$0]++;next}
(因为
NR==FNR
只有在使用
file1
时才会为真)。此操作将每一行存储在一个
数组中
添加
下一个
,这样就不会调用
第二个操作
。一旦此
NR==FNR
变得
不真实
,将永远不会调用
第一个操作
awk
移动到
第二个操作,即检查
file2
关于
array
(即
file1
)。如果
file2
的内容在
array
中,我们将忽略它。如果它不在数组中,我们将其打印为额外的行,并且仅在
file2

测试:

[jaypal:~/Temp] awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
文件1:

文件2:

执行:

[jaypal:~/Temp] awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
这可能适合您(GNU diff):


无法使其工作,但无论如何,谢谢-当我尝试上面的文件时,也没有得到任何输出。找出为什么它对我不起作用,这是因为我的diff命令为差异添加了+和-,而不是<和>-非常感谢:)哇,太棒了-正是我想要的,非常感谢。现在我必须阅读并努力理解它为什么有效!!!我补充了一些解释。希望有帮助。
diff -bu file1 file2 | sed -n '1,2d;s/^+//p'
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
diff -b sample.log sample.log.1 | awk '/>/ {print $2}'