Problemas de uso de classificação e comunicação

4

Eu estava tentando encontrar a interseção de dois arquivos de dados simples e descobri em um post anterior que isso pode ser feito por meio de

comm -12 <(sort test1.list) < (sort test2.list)

Parece-me que sort test1.list pretende classificar o test1.list em ordem. Para entender como sort funciona, tentei sort no arquivo a seguir, test1.list como sort test1.list > test2.list

100
-200
300
2
92
15
340

No entanto, acontece que test2.list é

100
15
2
-200
300
340
92

Esta lista reordenada me deixa bastante confuso sobre como esse tipo funciona, e como o tipo e a comunicação funcionam juntos.

    
por user288609 22.01.2012 / 05:28

3 respostas

11

De acordo com o manual comm , "Antes de 'comm' poder ser usado, os arquivos de entrada devem ser classificados usando a seqüência de intercalação especificada pela localidade 'LC_COLLATE'."

E o sort manual: "A menos que seja especificado de outra forma, todas as comparações usam a sequência de intercalação de caracteres especificada pela localidade 'LC_COLLATE'.

Portanto, e um teste rápido confirma, a LC_COLLATE order comm expects é fornecida pela ordem padrão de sort , tipo de dicionário.

sort pode classificar arquivos de várias maneiras:

  • -d : ordem do dicionário - ignora tudo, menos o espaço em branco e alfanuméricos.
  • -g : numérico geral - alfa, depois números negativos e, em seguida, positivos.
  • -h : legível para humanos - negativo, alfa, positivo. %código%
  • n < nk = nK < nM < nG : numérico - negativo, alfa, positivo. -n , k , M , etc. não são especiais.
  • G : versão - positiva, limite, inferior, negativo. %código%
  • -V : não diferencia maiúsculas de minúsculas.
  • 1 < 1.2 < 1.10 : Aleatório - embaralhe a entrada.
  • -f : Reverse - normalmente usado com -R

Existem outras opções, é claro, mas estas são as que você provavelmente verá ou precisará.

Seu teste mostra que a ordem de classificação padrão é provavelmente -r , ordem do dicionário.

  d   |   g   |   h   |   n   |   V 
------+-------+-------+-------+-------
  1   |  a    | -1G   | -10   |  1
 -1   |  A    | -1k   | -5    |  1G
  10  |  z    | -10   | -1    |  1g
 -10  |  Z    | -5    | -1g   |  1k
  1.10| -10   | -1    | -1G   |  1.2
  1.2 | -5    | -1g   | -1k   |  1.10
  1g  | -1    |  a    |  a    |  5
  1G  | -1g   |  A    |  A    |  10
 -1g  | -1G   |  z    |  z    |  A
 -1G  | -1k   |  Z    |  Z    |  Z
  1k  |  1    |  1    |  1    |  a
 -1k  |  1g   |  1g   |  1g   |  z
  5   |  1G   |  1.10 |  1G   | -1
 -5   |  1k   |  1.2  |  1k   | -1G
  a   |  1.10 |  5    |  1.10 | -1g
  A   |  1.2  |  10   |  1.2  | -1k
  z   |  5    |  1k   |  5    | -5
  Z   |  10   |  1G   |  10   | -10
    
por 22.01.2012 / 06:52
0

Você pode fazer a classificação usando sort -n filename para classificar e usar o comando comm .

    
por 22.01.2012 / 05:40
0

Apenas para detalhar a resposta abrangente e ilustrativa de Kevin: se você executar comm com o sinalizador sem distinção entre maiúsculas e minúsculas, comm -i , também deverá classificar sem diferenciar maiúsculas de minúsculas, por exemplo, sort -f .

Exemplo completo:

comm -i <(sort -i test1.list) <(sort -i test2.list)

Caso contrário, o nativo sort (sem sinalizadores) funciona.

    
por 26.10.2017 / 18:30