Linhas de correspondência que começam com o mesmo padrão em dois arquivos de texto

2

Agora estou tendo dois arquivos de texto com algumas das linhas começando com o mesmo padrão. Por exemplo,

Arquivo A

1Mo 1,1 I love you.
1Mo 1,2 I like you.
Hi 23,3 I am hungry.
Hi 23,4 I am foolish.

Arquivo B

1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.
Hi 23,5 Ich habe Durst.
Hi 23,6 Ich bin neu.

O Arquivo A e o Arquivo B têm duas linhas que começam com o mesmo padrão "1Mo 1,1" e "1Mo 1,2", respectivamente. Minha saída esperada é assim:

1Mo 1,1 I love you.
1Mo 1,2 I like you.
1Mo 1,1 Ich liebe dich.
1Mo 1,2 Ich mag dich.

Minha idéia é que eu use o grep para extrair o padrão inicial de cada linha no arquivo A, usando esses padrões para corresponder a cada linha no arquivo B. Eu tentei escrever um comando grep da seguinte forma, mas ele falhou:

grep "^[.A-z]*\s[.]*\s" file A > extract.txt

Este é o comando que eu pesquisei na comunidade e me adaptei para usar a string correspondente no arquivo B:

while read string; do grep "$string" file B; done < extract.txt

Alguém está tendo alguma idéia sobre como fazer o grep para extração e combinação de padrões?

    
por hui 16.11.2015 / 16:09

2 respostas

1

Arquivos:

> 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.

Encontre as linhas comuns que compartilham as duas primeiras palavras (separadas por espaço):

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

Agora, encontre todas as linhas que correspondem apenas a esses padrões:

> 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.

Finalmente, filtre o nome do arquivo:

> 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.
    
por 17.11.2015 / 02:19
0

O Grep excede mais de um argumento e você pode usar esse padrão simples pelos seus exemplos.

grep -Eh '1,1|1,2' "File A" "File B"
    
por 16.11.2015 / 16:33