匹配两个文本文件中以相同模式开头的行

匹配两个文本文件中以相同模式开头的行

我现在有两个文本文件,其中一些行以相同的模式开头。例如,

文件A

1Mo 1,1 我爱你。
1Mo 1,2 我喜欢你。
嗨 23,3 我饿了。
嗨 23,4 我很愚蠢。

文件B

1Mo 1,1 Ich liebe dich。
1Mo 1,2 Ich mag dich。
嗨,23,5 我是杜斯特。
嗨,23,6 Ich bin neu。

文件 A 和文件 B 有两行,分别以相同的模式“1Mo 1,1”和“1Mo 1,2”开头。我的预期输出是这样的:

1Mo 1,1 我爱你。
1Mo 1,2 我喜欢你。
1Mo 1,1 Ich liebe dich。
1Mo 1,2 Ich mag dich。

我的想法是我应该使用 grep 提取文件 A 中每一行的开始模式,然后使用这些模式来匹配文件 B 中的每一行。我尝试编写一个 grep 命令,如下所示,但失败了:

grep "^[.Az]*\s[.]*\s" 文件 A > extract.txt

这是我搜索社区并改编为用于文件 B 中的字符串匹配的命令:

读取字符串时;执行 grep "$string" 文件 B;完成 < 提取.txt

有人知道如何使用 grep 进行模式提取和匹配吗?

答案1

文件:

> cat a
1Mo 1,1 I love you.
1Mo 1,2 I like you.
1Mo 1,3 I am hungry.
1Mo 1,4 I am foolish.

> cat b
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
1Mo 1,5 Ich habe Durst.
1Mo 1,6 Ich bin neu.

找到共享前两个单词的公共行(空格分隔):

> awk '{print $1 " " $2}' a > find
> grep -f find b | awk '{print $1 " " $2}' > find2

现在找到与这些模式匹配的所有行:

> grep -f find2 a b
a:1Mo 1,1 I love you.
a:1Mo 1,2 I like you.
b:1Mo 1,1 Ich liebe dich.
b:1Mo 1,2 Ich mag dich.

最后,过滤文件名:

> grep -f find2 a b | sed 's/^[^:]*://'
1Mo 1,1 I love you.
1Mo 1,2 I like you.
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.

答案2

Grep 排除多个参数,您可以在示例中使用这一简单模式。

grep -Eh '1,1|1,2' "File A" "File B"

相关内容