mantendo o número da linha ao processar texto dentro de um grep

1

Tem um programa complicado e complexo que é usado para pré-processamento de texto, a fim de enviá-lo para um software de Machine Learning.

Para resumir a história:

O script bash entra em uma pasta onde milhares de arquivos de texto estão aguardando, abrindo-os com CAT, limpando e excluindo linhas supérfluas e, em seguida, antes de enviar arquivos para o processo de Aprendizado Automático, grava um CSV em disco com algumas informações para humanos posteriores verificação.

É muito importante manter o número da linha além do conteúdo, porque a ordem de aparição de palavras é a chave para o processo ML.

Portanto, a abordagem mi é adicionar o número da linha a cada linha dessa maneira (um liner com muitos comandos canalizados):

for every file in *.txt
do

cat -v $file | nl -nrz -w4 -s$'\t' | .......

Então eu me livrei de linhas indesejadas desta forma (amostra):

 ...... | sed '/^$/d'| grep -vEi 'unsettling|aforementioned|ruled' 

e, finalmente, manter duas linhas para processamento posterior desta maneira:

........ | grep -A 1 -Ei 'university|institute|trust|college'

A saída é algo assim (amostrando dois arquivos):

file 1.txt
0098  university of Goteborg is downtown and is one of the
0099  most beautiful building you can visit

0123  the institute of Oslo for advanced investigation
0124  is near the central station and keeps

0234  most important college of Munich
0235  and the most acclaimed teachers are

file 2.txt
0023  there is no trust or confidence
0024  in the counselor to accomplish the new

0182  usually the college is visited
0183  every term for the president but

[EDITADO] Perdeu este passo que estava na linha errada. Desculpe.

Em seguida, o texto é empilhado em "parágrafos" desta maneira:

tr '\n\r' ' '| grep -Eio '.{0,0}university.{0,25}|.{0,0}college.{0,25}'

[END EDIT]

Esta saída é salva como variável "CLEANED_TXT" e canalizada para um WHILE, desta forma:

while read everyline; do 

    if [[ -n "${everyline// }" ]];then

            echo "$file;$linenumber;$everyline" >> output.csv
    fi  

    done <<< "$CLEANED_TXT"

done  # for every text file

SAÍDA DESEJADA FINAL

file 1.txt;0098;university of Goteborg
file 1.txt;0123;the institute of Oslo
file 1.txt;0234;college of Munich

Meu problema é o número da linha é perdido nesta última etapa devido ao GREP antes do loop. Leve em conta que eu preciso do número da linha original. Renumerar dentro do loop não é permitido.

Estou preso. Qualquer ajuda seria muito apreciada.

Atenciosamente

    
por jomaweb 18.08.2016 / 19:40

1 resposta

0

UPDATE2 elimine todo o tr ... | grep line (é só fazer uma bagunça) e substitua o while por:

while read linenumber everyline; do
        everyline=$(echo $everyline | grep -Eio '.{0,0}university.{0,25}|.{0,0}college.{0,25}')
        if [[ -n "$everyline" ]]; then
            echo "$file;$linenumber;$everyline" >> output.csv
        fi
done

que preencherá $linenumber com o valor correto e as palavras correspondentes no lugar certo:

file1.txt;0098;university of Goteborg is downtown
file1.txt;0234;college of Munich
file1.txt;0182;college is visited

observe, no entanto, que a coisa toda é uma bagunça e deve ser reescrita em perl ou awk ou similar.

    
por 18.08.2016 / 21:28