我真的不知道如何从以下方面着手。假设我有两个文件file1
和file2
。这些文件由两个条目的长列表组成,每个条目具有相同的结构
A : some text0
B : some text1
A : some text2
B : some text3
...
A
和file1
的{{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"
但我需要的是某种更复杂的
答案 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
命令执行此操作。