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