从两个文本文件中获取公共行

时间:2013-06-28 09:25:44

标签: regex perl sed awk pattern-matching

我有两个文件。

第一个(file1)是这样的: (在'text'line'之前总是有一个标题)

>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

有人有线索,怎么办?

祝你好运

3 个答案:

答案 0 :(得分:3)

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

sort file1 file2 file2 | uniq -u

你已经完成了。

或者,如果文件很大,那么(file1 + file2 + file2)的排序是一个太大的负担,你可以使用它:

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

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

示例:

=$ 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

答案 1 :(得分:2)

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

#!/bin/bash

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

grep -B 1会在比赛前打印一行。我们可以按头砍掉第一行 这可能被称为黑客。 (但我还是初学者)。

file1:

  

&gt;随机标题名称1   wonderfulstringwhatsoevergoeson
  &gt;随机标题2
  someotherline

file2:

  

someotherline
  wonderfulstringwhatsoevergoeson

输出:

  

&gt;随机标题2
  &gt;随机标题名称1

同样理解这个解决方案正如depesz指出的那样缓慢。

答案 2 :(得分:2)

GNU代码

$sed '/^[>]/N;s#\(.*\)\n\(.*\)#/\2/s/.*/\1/p#' file1|sed -nf - file2
>random header 2
>random header name1