comm comm se comportando de maneira estranha

1

Eu tenho dois arquivos:

  1. um gerado usando o comando find em uma pasta para listar arquivos, classificando-os numericamente e gravando em um arquivo,
  2. e o outro gerado por um script python, que não é classificado, então eu o classifico explicitamente numericamente.

O problema é que minha saída sort tem apenas duas colunas e é a seguinte:

500016
    500016
500174
    500174
500277
    500277

Como você pode ver, até mesmo as entradas comuns são mostradas separadamente em duas colunas e a terceira coluna está faltando completamente, o que implica que não há nada comum entre os dois arquivos, enquanto essas três primeiras entradas são de fato iguais. sort funciona como esperado com alguns arquivos de teste que eu faço.

Eu sei que comm precisa dos dois arquivos para serem lexicalmente ordenados, e aqui está uma lista de opções que eu tentei e falhei:

comm <(sort file1.txt) <(sort file2.txt)

de link falhou. Eu também tentei dar a opção -d para sort explicitamente, e também tentei reescrever explicitamente os arquivos com classificação de dicionário - ambos não funcionaram

comm --check-order <(sort file1.txt) <(sort file2.txt)

de link não retornou nenhum erro de pedido; correu como de costume, dando duas colunas de saída.

Esta solução para um problema muito próximo do meu também não está funcionando.

Pensando que pode ser por causa de alguns caracteres adicionais no arquivo, eu também a solução mencionada aqui para do :set list no vim.

Só para testar se sort está causando problemas, eu classifiquei deliberadamente os arquivos de teste que fiz (com os quais comm trabalhou anteriormente) numericamente e comm ainda funcionou.

Eu tentei as soluções que pude encontrar, sem sucesso. Alguma outra sugestão?

    
por user128785 07.05.2018 / 21:30

1 resposta

1

Você tem quase certeza de que caracteres adicionais em cada linha estão fazendo com que as linhas correspondentes não correspondam exatamente. Esses caracteres adicionais podem ter a forma de caracteres de retorno de carro de terminadores de linha no estilo do Windows, caracteres de espaço ou tabulação ou possivelmente outros caracteres não imprimíveis. Por exemplo, talvez o script Python esteja justificando à direita os números, para que alguns ou todos tenham espaços iniciais.

A melhor coisa a fazer seria filtrar todos esses caracteres indesejados e, como os dados são estritamente numéricos, isso é muito fácil, por exemplo, com sed :

sed 's/[^0-9]//g' < input > output

Você pode interpor isso em vários pontos do processo. Aqui está apenas um:

comm <(sed 's/[^0-9]//g' file1.txt | sort) <(sed 's/[^0-9]//g' file2.txt | sort)
    
por 07.05.2018 / 21:49

Tags