Gerar sugestões para erros de um dicionário de pesquisa

3

EDIT: os arquivos foram alterados para tsv para lidar melhor com espaços em campos de texto

Eu tenho 2 arquivos csv no seguinte formato:

Arquivo 1: availableText.csv (pode ser muito grande)

"id1" , "text1-1"
"id1" , "text1-2"
"id1" , "text1-3"
"id1" , "text1-4"
"id2" , "text2-1"
"id2" , "text2-2"
"id2" , "text2-3"
"id2" , "text2-4"
...

Arquivo 2: wrongText.csv

"id1" , "texta"
"id2" , "textb"
"id3" , "textc"
"id4" , "textd"
...

Para cada linha em wrongText.csv , desejo filtrar as entradas de texto disponíveis para o mesmo id e sugerir a melhor opção disponível usando tre-agrep (funções grep que permitem erros no padrão e usando retornos -B o melhor jogo)

Por exemplo, para id1 :

tre-agrep -B 'texta' (from text1-1:4) | tr "\n" "$"
( will produce something like 'text1-2$text1-4' )

O arquivo de saída desejado seria assim:

"id1" , "texta" , "text1-2$text1-4"
"id2" , "textb" , "text2-1$text2-3$text2-4"

Nota:

  1. O CSV pode ser convertido em qualquer formato, mas o texto pode conter espaços (mas não caracteres especiais)
  2. IDs contêm caracteres especiais e utf-8
  3. A velocidade não importa (pelo menos por enquanto)
por jimkont 13.04.2011 / 18:16

2 respostas

0

Eu alterei os arquivos de entrada para o tsv e usei a seguinte solução (inspirada na primeira resposta)

echo "" > wrong_variables.tmp  
while read line  
do  
    var_template='echo $line | cut -f2'  
    var_parameter='echo $line | cut -f3'  

    #TODO order by template and cache grep output  
    grep "${var_template}" templ2.tmp  | cut -f2 > tmpfile  
    var_suggest='tre-agrep -B "$var_parameter" tmpfile | tr "\n" "$"'  

    echo $line \t $var_suggest >> wrong_variables.tmp
done < $OUTPUT_RAW
    
por 14.04.2011 / 21:29
1

Como oneliner com resultado:

for pattern in $(awk '{print $3}' wrong.csv) ; do tre-agrep -B $pattern available.csv | tr "\n" "$"; echo ; done  
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$
"id1" , "text1-1"$"id1" , "text1-2"$"id1" , "text1-3"$"id1" , "text1-4"$"id2" , "text2-1"$"id2" , "text2-2"$"id2" , "text2-3"$"id2" , "text2-4"$

melhor legível:

for pattern in $(awk '{print $3}' wrong.csv) 
do
  tre-agrep -B $pattern available.csv | tr "\n" "$"
  echo
done  

Algo assim?

    
por 13.04.2011 / 20:40