Classificando problemas no Linux

2

Eu estou classificando arquivos que possuem nomes de genes e seus valores de expressão. Todos os arquivos têm o mesmo número exato de linhas, no entanto, após a classificação, há uma diferença no posicionamento de determinados genes. Isso é muito estranho. Abaixo estão as versões classificadas de dois desses arquivos.

por exemplo:

Cxx1c   25.1695
Cxxc1   15.2228
Cxxc4   0.952061
Cxxc5   3.13309
**Cyb5  157.426**
Cyb561  0.425933
Cyb561a3    9.55082
Cyb561d1    4.00422
Cyb561d2    3.04411
Cyb5b   16.7622
Cyb5d1  7.25191
Cyb5d2  2.85109
Cyb5r1  15.2511
Cyb5r2  0.48748

Outro arquivo tem essa classificação. Basicamente, neste arquivo Cyb5 está presente após o gene Cyb561d2. Como posso ter exatamente a mesma ordem de classificação? Existe algum parâmetro para fazer isso?

Cxx1c   44.9795
Cxxc1   19.0346
Cxxc4   1.17429
Cxxc5   2.71589
**Cyb561    7.11003**
Cyb561a3    1.97601
Cyb561d1    2.13004
Cyb561d2    2.03376
Cyb5    64.074
Cyb5b   14.5329
Cyb5d1  12.0212
Cyb5d2  1.47763
Cyb5r1  10.5463
Cyb5r2  0

Aqui está o meu código que gera o arquivo classificado acima:

for i in *.txt; do
    sort  -d $i >$i.sort
done
    
por Ron 06.03.2017 / 22:08

2 respostas

2

Você está classificando a linha inteira no momento, mas parece que deseja classificar apenas na primeira coluna. Com a maneira como seu comando é atualmente escrito, as colunas serão basicamente concatenadas juntas, por exemplo:

Cyb5    157.426  -> Cyb5157426
Cyb561  0.425933 -> Cyb5610425933

vs

Cyb561  7.11003 -> Cyb561711003
Cyb5    64.074  -> Cyb564074

Para classificar apenas a primeira coluna, você precisará usar o seguinte comando:

sort -d -k1,1
    
por 06.03.2017 / 23:12
4

Cyb5 157.426 classifica antes de Cyb561 0.425933 , enquanto Cyb5 64.074 ordena após Cyb561 7.11003 , porque, em sua localidade, os espaços em branco são ignorados no primeiro passo de ordenação, portanto, o pedido está mais próximo do dicionário inglês.

Por exemplo, em um dicionário, você teria a priori entre apiary e Arrival .

Aqui, comparando Cyb5 157.426 com Cyb561 0.425933 compara o primeiro Cyb5157.426 com Cyb5610.425933 na primeira passagem porque o primeiro peso do caractere de espaço é IGNORE .

Se você quiser evitar esse processamento especial, altere a localidade para C , onde o pedido é baseado exclusivamente nos valores do ponto de código dos caracteres.

LC_ALL=C sort -d file

Ou como @Swiss disse, apenas classifique no primeiro campo:

sort -d -k1,1 file

No entanto, observe que o delimitador de campo é a transição de um não-branco para um branco, e os espaços em branco são incluídos nos campos.

Então:

 b x
a x

com sort -d -k1,1 ainda seria classificado como

a x
 b x

na sua localidade porque os espaços são ignorados, mas como:

 b x
a x

Na localidade C, conforme o caractere de espaço é classificado antes de a .

Você pode querer adicionar a opção -b para que os espaços em branco iniciais sejam sempre ignorados, independentemente da localidade. Ou, novamente, corrija o código de idioma para C se quiser que as linhas que começam com espaços sejam classificadas primeiro.

    
por 07.03.2017 / 16:59