Sed

匹配兩個文本文件中以相同模式開頭的行

  • November 19, 2015

我現在有兩個文本文件,其中一些行以相同的模式開頭。例如,

文件 A

1Mo 1,1 我愛你。
1Mo 1,2 我喜歡你。
嗨 23,3 我餓了。
嗨 23,4 我很愚蠢。

文件 B

創世記 1:1 我愛你。
創世記 1:2 我喜歡你。
嗨 23.5 我渴了。
嗨 23.6 我是新來的。

文件 A 和文件 B 有兩行分別以相同的模式“1Mo 1,1”和“1Mo 1,2”開頭。我的預期輸出是這樣的:

1Mo 1,1 我愛你。
1Mo 1,2 我喜歡你。
創世記 1:1 我愛你。
創世記 1:2 我喜歡你。

我的想法是我應該使用 grep 來提取文件 A 中每一行的開始模式,然後使用這些模式來匹配文件 B 中的每一行。我嘗試如下編寫 grep 命令,但它失敗了:

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

這是我在社區中搜尋並適用於文件 B 中的字元串匹配的命令:

讀取字元串時;執行 grep “$string” 文件 B;完成<提取.txt

有人知道如何為模式提取和匹配做 grep 事情嗎?

文件:

> 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 &gt; find
> grep -f find b | awk '{print $1 " " $2}' &gt; 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.

引用自:https://unix.stackexchange.com/questions/243338