awk / grep para combinar a palavra em dois arquivos [duplicado]

1

Eu tenho dois arquivos:

file1 :

905894
1197693
3703749

file2 :

905894   Test1
1197693   Test2
3703749  Test3

Eu quero obter os valores na segunda coluna se os elementos na coluna 1 do arquivo 1 corresponderem a qualquer uma das palavras na coluna 1 do arquivo 2.

Eu sei que o awk pode fazer isso, mas ficou preso lendo o arquivo 1 e usando um loop.

    
por user112644 30.04.2015 / 22:10

2 respostas

1

Usando grep :

$ grep -wFf file1 file2 
905894   Test1
1197693   Test2
3703749  Test3
  • -f indica que estamos usando padrões (um por linha) para serem correspondidos de file1

  • -F tirará os padrões de file1 como sequências fixas, o que significa que nenhuma outra operação deve ser feita antes da correspondência

  • -w indica que estamos combinando linhas que contêm os padrões como palavras inteiras. Observe que apenas [A-Za-z0-9_] são considerados como caracteres constituintes da palavra, qualquer outro caractere será considerado como delimitador de palavras. Isso garantirá que apenas colunas inteiras sejam correspondidas, e não algo como 905894abcd nas colunas.

Verifique man grep para ter mais ideia sobre isso.

    
por 30.04.2015 / 22:16
0

Eu usaria perl eu mesmo.

  • leia no arquivo 1, extraia uma lista de números.
  • iterar arquivo 2, extraindo número e palavra
  • verifique se 'number' no arquivo2 estava presente no arquivo1 e, se for o caso, imprima a palavra.

Algo parecido com isto:

#!/usr/bin/perl

use strict;
use warnings;

my %in_file1;

open( my $file1, "<", "file1.txt" ) or die $!;

while (<$file1>) {
    my ($number) = m/(\d+)/;
    $in_file1{$number}++;
}
close($file1);

open( my $file2, "<", "file2.txt" ) or die $!;

while (<$file2>) {
    my ( $number, $word ) = split;
    if ( $in_file1{$number} ) { print $word, "\n"; }
}

close($file2);
    
por 30.04.2015 / 23:35

Tags