A melhor maneira de classificar manualmente arquivos de texto aleatórios?

1

Tenho cerca de 1000 arquivos de texto e preciso visualizar cada um deles e movê-lo para uma pasta, se for a correta. Eu só posso fazer ordenação básica por comprimento / tamanho, e não posso grep porque o texto é aleatório. Como posso fazer isso além de manualmente abrir + salvar cada no gedit. Eu estou no Ubuntu Linux. Obrigado

Já fiz toda a classificação possível com base no tamanho, na contagem de palavras, nos dados, na data, etc. Isso é o que sobra. Estou tentando encontrar uma maneira fácil de visualizar + salvar / ignorar o resto.

    
por Kenster 06.06.2010 / 06:07

6 respostas

5

Suponho que você provavelmente não use vim ... então talvez isso sirva como incentivo para aprendê-lo, ou talvez um breve tutorial ...

$ vim *

irá abrir todos os arquivos;

:!mkdir mine/; mkdir notmine/

criará diretórios chamados "mine" e "notmine";

:!mv % mine/

moverá o arquivo atual para um diretório chamado "mine";

:bdel

soltará o arquivo daqueles que o vim está lidando e mudará para o próximo;

:!mv % notmine/

irá mover o arquivo atual para um diretório chamado "notmine". O que está acontecendo com esses comandos de movimentação é

  • : entra no modo de linha de comando
  • ! inicia um comando shell
  • % faz com que o vim substitua o nome do arquivo atual. Se algum dos nomes de arquivo tiver espaços neles , você precisará citar duas vezes o argumento % , por exemplo, :!mv "%" mine/ .

Atingir : , depois b e, em seguida, a seta para cima para obter novamente o comando :bdel .

Acerte : , depois !mv e, em seguida, a seta para cima repetidamente para percorrer os comandos anteriores !mv ... . Você também pode digitar :! e depois a seta para cima, mas isso também receberá o comando !mkdir... .

Caso você não tenha adivinhado, a seta para cima no "modo de linha de comando" do vim (o que você digita pressionando : no "modo normal") fará com que ele passe pelos comandos anteriores que começam com tudo o que você já digitou lá.

Além disso, com a chance de que você esteja fazendo isso sem nenhuma experiência anterior com o vim, devo primeiro elogiá-lo por fazer uma jogada tão ousada e, em seguida, informar que se a qualquer momento você acidentalmente acertar uma tecla o teclado e você começa a digitar coisas no arquivo, ou as coisas funcionam inesperadamente, acesse <ESC> algumas vezes e, em seguida, u desfaça todas as alterações feitas acidentalmente . Se você for muito longe (não é realmente um problema para este exemplo, já que você não modificará nenhum arquivo), você selecionou <CTRL>-R para refazer coisas que acabou de desfazer. O <ESC> o levará para fora do modo de Inserção ou modo Visual, de volta ao modo Normal, que é onde todos esses comandos realmente funcionam.

Ok .. depois desse pequeno PSA, voltando à programação programada regularmente.

Para tornar o processamento de arquivos mais eficiente, você pode configurar algumas macros:

qm:!mv % mine/<CR>:bdel<CR>q

Isso realmente terá o efeito de mover o arquivo atual e soltá-lo da "lista de buffers" do vim, então tenha certeza que é um dos seus quando você configurar esta macro. Observe que <CR> indica que você pressionou a tecla ENTER nesse ponto; na verdade não digita <CR> .

qn:!mv % notmine/<CR>:bdel<CR>q

Mesma coisa aqui.

Em seguida, para mover um arquivo para o diretório "mine" e seguir em frente na lista de buffers, você faz

@m

Ou se não for seu

@n

Na verdade, pode ser mais sensato mapear essas macros para letras mais distantes no teclado do que m e n .. mas essa é a ideia básica.

    
por 06.06.2010 / 10:05
2

Como Mark disse, você precisará ser mais específico sobre os arquivos. Em vez de gedit, você pode usar o less pager ou head/tail para visualizar partes do arquivo e, em seguida, o utilitário mv para movê-lo. Isso deve tornar o processo um pouco mais rápido.

Para uma abordagem programática, dependendo do tamanho do arquivo e se ele caberia em uma tela, você poderia fazer algo com essa lógica:

for each file in the directory
       print it's contents to the screen
       prompt for yes/no
       if yes
             move file to other directory
       else
             leave file alone

então, essencialmente, seu programa mostraria o conteúdo de cada arquivo, e se você quisesse movê-lo, pressione Y , caso contrário, pressione N . Dessa forma, cada arquivo pode ser manipulado em 1 ou 2 pressionamentos de tecla, dependendo de como você o escreve.

    
por 06.06.2010 / 06:33
2

Eu estava entediado:

$ cat disposition
#!/bin/sh

# pick your preferred viewer
VIEWER=less
VIEWER=head

# the log file will actually be a script that undoes all the
# changes made, so it is more like an inverted log
log=/tmp/disposition.$$

prog=$0
dest=$1

case $# in
    0|1) echo "usage $prog dest_dir file ..."
         echo "  presents files and asks for a disposition"
         echo "  if disposition is 'yes' move it to dir"
         echo "  otherwise do nothing"
         exit 1;;
esac
# some shells may have limits on command lengths so for many files
# you might have to:
#    disposition dest_dir a*
#    disposition dest_dir b*
#    etc.

if [ ! -d $dest ] ; then
    echo "$prog: destination $dest is not a directory"
    exit 1
fi

cat > $log <<EOF
#!/bin/sh
# inverted log file created by $prog
#

EOF

shift           # toss away dest_dir from args
for file; do    # in "$@" is implied
    if (echo "===== $file =====" ; cat $file ) | $VIEWER; then
        read -p "move $file to $dest? " move
        case $move in
            [yY]*)
                echo mv \"$dest/$file\" \"$file\" >> $log
                mv "$file" "$dest/$file"
                ;;
        esac
    fi
done

echo "$prog: inverted log script can be found in $log"
    
por 06.06.2010 / 09:21
1

Suponho que você já saiba disso, mas para o benefício de outros, você pode usar head (ou tail) para mostrar as primeiras linhas do arquivo. Isso será mais factível do que imprimir a coisa toda.

E, claro, escreva o script bash =)

com experiência em programação, acho que esse tutorial seria bastante adequado para programar um script como link

(e eu sou preguiçoso o suficiente para não escrever um)

    
por 06.06.2010 / 07:46
1

Eu queria saber se os classificadores bayesianos ingênuos poderiam se aplicar ao código e encontrar Reverendo do DivMod . O que me impressionou foi a linha:

* is your code more like Guido's or Peter's 

Parece um pouco envelhecido, mas o reverendo Bayes também não está ficando mais jovem. Está disponível como o pacote do Ubuntu python-reverend, mas estou com muito sono para criar subclasses de um reconhecedor agora mesmo.

    
por 06.06.2010 / 10:37
0

Você poderia ser mais específico sobre por que o grep não atende às suas necessidades? Se não há um método discernível para a loucura, então, à mão, é o único caminho. Você não pode ordenar automaticamente / programaticamente as coisas se não houver condições que você possa dar para a classificação.

    
por 06.06.2010 / 06:14