padrões grep do arquivo1 para a coluna do arquivo2

2

Eu tenho dois arquivos:

$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h

Gostaria de pesquisar padrões de File1 em File2 , uma espécie do que o grep -f File1 File2 faria, mas pesquisando os padrões relatados em File1 apenas em $1 de File2

Exemplo de saída:

$cat File3
A aaa B
B aaa h
    
por aechchiki 17.08.2017 / 07:34

3 respostas

3

com awk :

awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
  • NR==FNR{a[$0]=NR; next} : para o primeiro arquivo ( f1.txt ) estamos colocando o registro como chave para um array de assicioes com o número de registro correspondente como valor

  • a[$1] : para o segundo arquivo ( f2.txt ), o registro será impresso somente se o primeiro campo for uma chave da matriz a

Exemplo:

% cat f1.txt                                       
A
B
C

% cat f2.txt                                       
A aaa B
D bbb A
B aaa h

% awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
A aaa B
B aaa h
    
por 17.08.2017 / 07:38
0

Usando o comando join :

join <(sort file1) <(sort file2)

Se os arquivos estiverem classificados.

join file1 file2
    
por 17.08.2017 / 08:09
0

Com bash ou qualquer shell que entenda a substituição do processo:

$ grep -f <( awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 ) File2
A aaa B
B aaa h

A ideia aqui é criar os padrões corretos para grep -f File1 trabalhar diretamente em File2 transformando cada linha em File de something na expressão regular ^something[[:blank:]] (prefixo com circunflexo e sufixo com [[:blank:]] ).

O circunflexo fixa o padrão ao início da linha e [[:blank:]] força uma correspondência contra um espaço ou um caractere de tabulação.

O GNU grep também pode ler padrões da entrada padrão:

$ awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 | grep -f - File2
A aaa B
B aaa h

O comando awk pode ser substituído por um comando equivalente sed (se você preferir sed over awk ):

$ sed -e 's/^/^/' -e 's/$/[[:blank:]]/' File1 | grep -f - File2
    
por 17.08.2017 / 08:10