2

次からの進め方が本当にわかりません。2 つのファイルがあるfile1としfile2ます。これらのファイルは、それぞれが同じ構造を持つ 2 つのエントリの長いリストで構成されています。

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パイプするコンテキストオプションを使用して、一致後の行も表示します。grepfile2-A1

于 2013-01-07T08:13:11.547 に答える
1

次のコマンドは、サンプルで機能します。

grep '^msgid' file1 | while read id; do grep -A2 -e "$id" file2; done > file3
于 2013-01-06T17:59:24.483 に答える
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 に答える
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 に答える