4

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

我有 2 个文件,一个是 325 行长,一个是 361 行长。

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

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

即文件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

即文件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

任何帮助或建议将不胜感激,不幸的是我不是 *nix 人:( 我尝试了一些差异表达式和 comm 表达式,但无法得到我需要的东西。

4

4 回答 4

3

试试这个神奇的命令:

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

sed -n 's/^> \(.*\)/\1/p'应该找到以 . 开头的行>并输出不带>. 这不起作用的可能原因是系统中 diff 的不同输出?

于 2011-12-20T17:46:59.443 回答
1

这应该工作 -

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

解释:

NR并且FNRawk's built-in variables。注册记录数,并且在处理两个文件时NR不会重置。类似于但在文件完全解析后重置为。0FNRNR0

在这个awk单行代码中,我们保留了仅对 file1NR==FNR强制执行操作的条件(只有在我们使用 时才会如此)。此操作将每一行存储在一个. 被添加以便不会被调用。一旦 this变成,就永远不会被调用。移动到which 是检查相对于(ie ) 的内容。如果 的内容在 中,我们忽略它。如果它不在数组中,我们将打印它,因为这些行将是额外的并且仅在.{a[$0]++;next}NR==FNRfile1arraynextsecond actionNR==FNRuntruefirst actionawksecond actionfile2arrayfile1file2arrayfile2

测试:

文件1:

[jaypal:~/Temp] cat file1
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

文件2:

[jaypal:~/Temp] cat file2
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

执行:

[jaypal:~/Temp] awk 'NR==FNR{a[$0]++;next} !($0 in a){print $0}' file1 file2
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
于 2011-12-20T17:50:27.373 回答
0

这可能对你有用(GNU diff):

diff -bu file1 file2 | sed -n '1,2d;s/^+//p'
sadhasdgh
qyyutrytkdaslksad
utyiuiytiuyo
djakdjhgmv
asdjkljkgfyiyi
jghytpuptou
于 2011-12-20T21:05:47.450 回答
0
diff -b sample.log sample.log.1 | awk '/>/ {print $2}'
于 2011-12-21T21:50:12.873 回答