O arquivo processado Sed é exibido de maneira diferente no vi vs cat

3

Não sei dizer se sed está copiando meu arquivo. Em vi ou less ele é exibido corretamente, mas cat e more inserem outros caracteres. por que eles estão aparecendo de forma diferente

Eu estou em um sistema redhat linux com um xterm padrão.

o arquivo de guia bruto antes:

scaffold1000    693:14709284:741:333    129011535   1
scaffold1000    693:14709284:27:726 129011535   1
scaffold1000    693:14709284:44:1157    129011535   1
scaffold1000    693:14709284:771:459    129011535   1
scaffold1000    693:14709284:610:615    129011535   1
scaffold1000    693:14709284:1152:1159  129011535   1

aplicando sed :

sed -i 's/scaffold/scaffold\_/' [myfile]

Eu também tentei isso sem a barra invertida para o mesmo resultado.

Usando cat , vejo isto:

scaffold11000   693:14709284:741:333    129011535   1
scaffold11000   693:14709284:27:726 129011535   1
scaffold11000   693:14709284:44:1157    129011535   1
scaffold11000   693:14709284:771:459    129011535   1
scaffold11000   693:14709284:610:615    129011535   1

De onde veio esse '1'? : (

editando em vi ou usando less eu vejo:

scaffold_1000   693:14709284:741:333    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:27:726     129011535       1^M     1^M     1       
scaffold_1000   693:14709284:44:1157    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:771:459    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:610:615    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:1152:1159  129011535       1^M     1^M     1    

Os caracteres ^M têm algo a ver com isso? É como se eu não pudesse confiar em meus próprios olhos aqui ...

    
por shigeta 09.10.2012 / 18:36

3 respostas

7

Cada linha do arquivo contém a string

^M     1

duas vezes. Isto é,

<carriage-return><tab>1
^M^I1
\r\t1

(Essas são três representações diferentes dos mesmos caracteres de controle)

Quando isso é enviado diretamente para o seu terminal, como cat fará, o terminal interpreta isso como uma instrução para voltar ao início da linha, mover mais de 8 caracteres e exibir um 1 .

Quando você cat do arquivo original, esse 1 adicional é exibido sobre um 1 existente, por isso você não percebeu.

Depois de alterar o prefixo de scaffold para scaffold_ , o 1 adicional agora é exibido sobre o _ , então agora você percebeu isso.

Quando você abre o arquivo em vi ou emacs , o editor não interpreta a sequência <carriage-return> da mesma maneira, mas a exibe.

Suponho que você não deseja as strings <carriage-return><tab>1 em seu arquivo. Você pode removê-los com sed :

sed -i 's/\r\t1//g' myfile

Com relação ao comentário "Não posso confiar em meus próprios olhos" - já que as sequências de controle mudam a forma como as coisas são exibidas, sim, elas podem ser confusas. Uma maneira de ver as coisas mais claramente é com cat -v e -T opções:

-v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
-T, --show-tabs          display TAB characters as ^I
-t                       equivalent to -vT

Por exemplo:

$ cat myfile
scaffold1test
$ cat -t myfile
scaffold_hello^M^I1
    
por 09.10.2012 / 19:56
-1

^M é um retorno de carro.

você pode usar dos2unix <file> para remover as chaves do DOS do seu arquivo

    
por 09.10.2012 / 18:40
-1

Se você não tem dos2unix , pode fazê-lo com sed :

sed -i 's/\r//g' <THE FILE NAME>

Ele removerá todos os retornos de carro.

    
por 09.10.2012 / 18:54

Tags