Correspondência de padrões entre dois arquivos no Linux?

0

Eu tenho dois arquivos .rtf .... O primeiro tem esse conteúdo:

Apple, Orange, Banana, Noodle, Chip

O segundo arquivo é algo assim:

     Apple I love eat Apple.
     Banana I hate Banana.
     Zoo I want to go Zoo.
     Noodle Noodle can be a very very very very very very very very very very very long, but still is one line.
     Chip Don't eat so many chip. 
     Orange Orange is great, not Apple plx. Noodle
     Water Drinking water is boring.

O primeiro arquivo é uma "chave" do segundo arquivo.

No segundo arquivo, a primeira palavra é a chave de cada linha.

Cada chave e frase no segundo arquivo, SOMENTE tem uma linha. O Segundo Arquivo tem muitas linhas com chaves, mas nem todas as chaves estão presentes em file1 , mas a chave file1 deve estar no segundo arquivo.

Como posso obter o resultado assim: (preciso classificar pela chave de file1 )

  Apple, Apple I love eat Apple. 
  Orange, Orange is great, not Apple plx.
  Banana, I hate Banana. 
  Noodle, can be a very very very very very very very very very very very long, but still is one sentence. 
  Chip, Don't eat so many chip.
    
por user28167 06.05.2010 / 15:37

4 respostas

1

Vou fazer algumas suposições (com as quais você parece concordar em sua pergunta).

  1. O arquivo de chaves é um CSV de chaves (lista separada por vírgulas de palavras-chave)
  2. O arquivo de dados tem chaves como as primeiras palavras que começam na primeira coluna
    • essa restrição pode ser gerenciada com mais algumas coisas no script
  3. O arquivo de dados não tem duas linhas que começam com a mesma palavra-chave
    • se esta restrição for quebrada, você obterá todas as linhas correspondentes | quando você procurar a chave.
    • que pode ser manipulado com um " | tail -1 " para mostrar apenas a primeira correspondência (digamos)
  4. Você começa a dizer rtf arquivos, mas marca a pergunta como text .
    Se você tiver arquivos em formato rich text, converta-os em arquivos de texto para essa finalidade.

aqui está um script para você,

#!/bin/bash
IFS=","
#    -> to look for comma separated words in key.txt

for k in $(sed 's| ||' key.txt)
#          -----------> to make the search easier
do
  grep "^$k " data.txt
#       ----> look for key words matching at the start of each line
done

Aqui key.txt é seu primeiro arquivo e data.txt é seu segundo arquivo.
O loop for classifica a saída na ordem das chaves.
O comando sed remove todos os espaços que você possa ter no arquivo key.txt para facilitar a pesquisa.

Atualizar em caracteres não ingleses (é por isso que parece que você diz arquivo RTF):
Procure por iconv e converta seu RTF em UTF-8 - acho que grep pode lidar com isso.
Se é isso que você quer fazer, sua pergunta deve ser reformulada como

"Como grep em arquivos formatados em rich text (no linux)?"

    
por 06.05.2010 / 16:12
0

Se você não precisasse que o resultado fosse classificado na ordem do arquivo-chave:

sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt

Para fazer a classificação, você pode fazer algo assim (no Bash):

sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt | sort | join -1 2 <(sed 's/, /\n/g' keyfile.txt | nl | sort -k2) - | sort -k2 | cut -d' ' -f1,3-
    
por 06.05.2010 / 18:14
0

Este script Perl fará isso:

#!/usr/bin/perl
use strict;
use warnings;

open (my $f1, '<', $ARGV[0]) || die "cannot open $ARGV[0] $!\n";
open (my $f2, '<', $ARGV[1]) || die "cannot open $ARGV[1] $!\n";

my $line=join('',<$f1>);
my @f2=<$f2>;

foreach my $e1 (sort split /, /,$line) {
    foreach my $e2 (@f2) {
        print "$e1, $e2" if ($e2=~/^$e1/);
    }
}
    
por 06.05.2010 / 18:05
0

Outra opção assumindo o seu arquivo de dados é 'data.txt':

for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done
    
por 06.05.2010 / 16:17