É um bug para juntar-se a -t \ t?

4

Eu tenho um problema com o comando join . "O campo de junção padrão é o primeiro, delimitado por espaço em branco" (Citado em join --help ). No entanto, há um campo contendo sentenças em meus arquivos delimitados por tabulação. Assim, eu quero juntar os dois arquivos usando -t\t (eu também tentei -t "\t" que relatou erros no Cygwin, mas não no CentOS). Inesperadamente, o comando emitiu os campos em duas linhas consecutivas. Eu processei os dois arquivos com dos2unix e sort .

O exemplo de saída é o seguinte. As linhas 1 e 3 são do arquivo 1, e as linhas 2 e 4 são do arquivo 2. As linhas 1 e 2 devem aparecer na mesma linha. No entanto, se -t\t for usado, eles aparecerão em duas linhas consecutivas (como abaixo); se não houver -t , eles aparecerão na mesma linha.

LM00089 0.6281  0       Q27888  L-lactate dehydrogenase
LM00089 gi|2497622|sp|Q27888|LDH_CAEEL  0.6281  0.422
LM00136 0.3219  0.376741        O62619  Pyruvate kinase
LM00136 gi|27923979|sp|O62619|KPYK_DROME        0.3219  0.111

Eu quero saber se é um bug ou cometi alguns erros.

    
por Dejian 01.09.2012 / 17:37

1 resposta

2

-t \t passa t como o separador: uma barra invertida sem aspas sempre pega o próximo caractere literalmente (exceto quando o próximo caractere é uma nova linha). -t "\t" passa \t como o separador, diferentes versões de join podem se comportar de maneira diferente quando você passa vários caracteres.

Para passar uma tabulação do bash, use -t $'\t' . A sintaxe $'…' imita o recurso de C e muitos outros idiomas em que \ seguido por letras designam caracteres de controle e \ pode ser seguido por dígitos octais.

Outra maneira é colocar uma guia literal no seu script (entre aspas simples ou duplas). Isso não é muito legível.

Se você precisar de portabilidade para todos os shells POSIX, como dash , use

tab=$(printf '\t')
join -t "$tab" …

ou diretamente join -t "$(printf '\t')" … .

    
por 02.09.2012 / 01:31

Tags