检索两个文本的部分共同内容

时间:2013-01-06 17:30:14

标签: macos unix sed grep diff

我真的不知道如何从以下方面着手。假设我有两个文件file1file2。这些文件由两个条目的长列表组成,每个条目具有相同的结构

A : some text0
B : some text1

A : some text2
B : some text3

...

Afile1的{​​{1}}条目通常相同但有时不同,file2条目完全不同。如何在B中检索A条目在file2中显示的所有“A-B”条目?

具体例子:

  • file1

    的样本
    file1
  • msgid "data0" msgstr "" msgid "data1" msgstr "" msgid "data2" msgstr ""

    的样本
    file2

所以我希望输出为msgid "data0" msgstr "data0_t" msgid "data1" msgstr "data1_t" msgid "nodata2" msgstr "nodata2_t"

file3

顺便说一下,我知道一些命令来交叉文件,如下所示:

msgid "data0"
msgstr "data0_t"

msgid "data1"
msgstr "data1_t"

但我需要的是某种更复杂的

5 个答案:

答案 0 :(得分:1)

以下命令适用于您的样本:

grep '^msgid' file1 | while read id; do grep -A2 -e "$id" file2; done > file3

答案 1 :(得分:1)

Perl解决方案:

#!/usr/bin/perl
use warnings;
use strict;

my %seen;

$/ = ''; # Paragraph mode
open my $IN1, '<', 'file1' or die $!;
undef $seen{ (split /\n/)[0] } while <$IN1>;

open my $IN2, '<', 'file2' or die $!;
exists $seen{ (split /\n/)[0] } and print while <$IN2>;

答案 2 :(得分:1)

如果你接受了awk,试试这个单行:

awk  -F'\\n' -vRS="" 'NR==FNR{a[$1];next;} $1 in a{print $1"\n"$2"\n"}' f1 f2

答案 3 :(得分:1)

只需使用grep

$ grep "^msgid" file1 | grep -A2 -f - file2
msgid "data0"
msgstr "data0_t"

msgid "data1"
msgstr "data1_t"

Grep来自msgid的所有file1行,并使用grep上下文选项将file2中的-A1行匹配到{{1}}行比赛结束后的线路。

答案 4 :(得分:0)

对于po个文件,msgcomm命令执行此操作。