2

我有两个文件。

第一个 ( file1) 是这样的:(在“文本”行之前总是有一个标题行)

>random header name1
wonderfulstringwhatsoevergoeson
>random header 2
someotherline
...

另一个文件(file2)是修改后的文件,file1如:(已删除标题并打乱了行,添加了新标题)

>name
someotherline
wonderfulstringwhatsoevergoeson

的每一行(没有标题)都file1出现在file2. 中的行顺序file2与 不同file1。两个文件都应保持原样。

中的每一行file2

输出应该是类似的:(file2可以忽略的标题)

>random header 2
>random header name1

有没有人有线索,怎么做?

此致

4

3 回答 3

3

鉴于文件应保持不变的说明,只需使用:

sort file1 file2 file2 | uniq -u

你就完成了。

或者,如果文件很大,因此 (file1+file2+file2) 的排序负担过重,您可以使用以下命令:

comm -23 <( sort file1 ) <( sort file2 )

它将只对每个文件进行排序(磁盘上的文件将保持原样,不会被修改),然后打印文件 1 中存在但文件 2 中不存在的行。

例子:

=$ cat file1 
some header
abc
cdf
efg
other header

=$ cat file2 
file2 header
cdf
file2 header part2
efg
abc

=$ comm -23 <( sort file1 ) <( sort file2 )
other header
some header
于 2013-06-28T09:55:17.887 回答
2

GNU 代码的代码:

$sed '/^[>]/N;s#\(.*\)\n\(.*\)#/\2/s/.*/\1/p#' file1|sed -nf - file2
>随机标题2
>随机标题名称1
于 2013-06-28T12:17:45.237 回答
2

如果我理解正确,您希望从 file1 打印与 file2 的每个元素相对应的相应标题。

#!/bin/bash

cat file2 | 
while read line; do 
    grep -B 1 "$line" file1 | head -n1
done

grep -B 1将在匹配前打印一行。我们可以将第一行逐头剪掉。
这可能被称为黑客攻击。(但我仍然是初学者)。

文件1:

>随机标题名称1
美妙的 字符串whatsoevergoeson
随机标题2其他线路

文件2:


其他一些奇妙的 字符串无论什么时候

输出:

>随机标题2
>随机标题名称 1

还要理解 depesz 指出的这个解决方案很慢。

于 2013-06-28T10:03:12.413 回答