extrai linhas que correspondem a uma lista de palavras em outro arquivo

2

Eu tenho o arquivo 1 com essas linhas:

ATM 1434.972183
BMPR2 10762.78192
BMPR2 10762.78192
BMPR2 1469.14535
BMPR2 1469.14535
BMPR2 1738.479639
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628
BMS1P17 1249.75
BMS1P17 1249.75
BMS1P17 1606.821429
BMS1P17 1606.821429
BMS1P17 1666.333333
BMS1P17 1666.333333
BMS1P17 2108.460317
BMS1P17 2108

E o arquivo 2 tem uma lista de palavras:

ATM
BMS1

Então, a saída será assim:

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

Eu sei que é realmente uma pergunta duplicada, mas eu tentei todos os tipos de grep e sed e awk , talvez funcione com vocês com esse pequeno exemplo mas eu tenho um arquivo muito grande > 1M lines e todo o caminho anterior não ajuda

ele retorna parte das linhas que contêm essas palavras, embora haja outras palavras em file 2 que correspondam às linhas de file 1

    
por Sara Wasl 25.07.2018 / 20:59

3 respostas

2

grep -Fw -f words myfile

Isso extrairia as linhas em myfile que contém as palavras no arquivo words em qualquer lugar.

As strings em words são tratadas como strings fixas (não expressões regulares) devido à opção -F , e a opção -w garante que somente linhas que contenham exatamente a mesma palavra > (nenhuma correspondência de substrings em palavras é permitida).

    
por 25.07.2018 / 21:03
0

Tente o comando join :

join file1 file2

ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628
    
por 25.07.2018 / 21:52
0

Outra das opções clássicas é com Awk:

$ awk 'NR==FNR {a[$1]++; next} $1 in a' words myfile
ATM 1434.972183
BMS1 4907.841667
BMS1 4907.841667
BMS1 880.4532628
BMS1 880.4532628

Este será insensível a qualquer espaço em branco nas entradas do arquivo words .

    
por 25.07.2018 / 22:19