2

我真的不知道如何从以下着手。假设我有两个文件,file1并且file2. 这些文件由一长串两个条目组成,每个条目具有相同的结构

A : some text0
B : some text1

A : some text2
B : some text3

...

和的A条目通常相同但有时不同,条目完全不同。如何检索出现 A 条目的所有“AB”条目?file1file2Bfile2file1

具体例子:

  • 样本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"

顺便说一句,我知道一些与文件相交的命令,如下所示:

for i in `cat file1 | awk {'print $1'}`
do
grep ${i} file2
done

但我需要的是更复杂的

4

6 回答 6

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上下文选项来显示匹配之后的行。

于 2013-01-07T08:13:11.547 回答
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>;
于 2013-01-06T18:03:43.460 回答
1

如果 awk 被您接受,请尝试以下单行:

awk  -F'\\n' -vRS="" 'NR==FNR{a[$1];next;} $1 in a{print $1"\n"$2"\n"}' f1 f2
于 2013-01-06T18:06:11.453 回答
1

以下命令适用于您的示例:

grep '^msgid' file1 | while read id; do grep -A2 -e "$id" file2; done > file3
于 2013-01-06T17:59:24.483 回答
0

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

于 2013-01-07T08:07:34.197 回答
0

这可能对您有用(GNU sed):

sed -n 's|^msgid.*|/^&/{N;N;p}|p' file1 | sed -nf - file2 > file3
于 2013-01-07T07:13:25.650 回答