Como corrigir o comando unix 'join' inserindo ^ M entre as colunas de junção? -Unix

2

Eu sou um programador iniciante. Eu estou usando o comando join do unix para unir alguns arquivos longos juntos.

join -j30 test test2
col1 col2 ... col30    col1 col2 ... col30
A    B        ZZZ   ^M A    B        ZZZ

Estou obtendo este caractere ^M na minha saída.

Por que isso está aí? e como eu removê-lo?

EDITAR: Abaixo está uma captura de tela da minha parte da minha saída

    
por Nicholas Hayden 18.04.2017 / 21:26

2 respostas

4

O ^ M significa que você está trazendo / editando arquivos no Windows.

Use o comando dos2unix sobre os arquivos para convertê-los para o modo de texto Unix.

O DOS usa retorno de linha e avanço de linha "\ r \ n" como final de linha, enquanto Unix usa apenas avanço de linha "\ n". Os ^ M são uma representação visual dos caracteres "extra".

Para instalar o comando dos2unix , do (em distribuições baseadas no Debian):

sudo apt-get install dos2unix

ou em um Mac (MacPorts):

sudo port install dos2unix

Alternativamente, você também pode fazer isso com sed como em:

sed 's/\r$//' dosfile.txt > unixfile.txt
    
por 18.04.2017 / 21:35
1

join(1) (pelo menos a versão que estou usando) não adiciona ^M ou retornos de carro aos arquivos unidos; No entanto, join copiará com alegria ^M . Um visualizador hexadecimal mais alguns casos de teste podem mostrar o que está acontecendo:

$ echo "1 a" > test1
$ echo "1 b" > test2
$ join test1 test2 | od -bc
0000000   061 040 141 040 142 012                                        
           1       a       b  \n                                        
0000006
$

E um caso de teste em que há ^M nos arquivos de entrada:

$ perl -E "say qq(1 a\r)" > test1
$ perl -E "say qq(1 b\r)" > test2
$ join test1 test2 | od -bc
0000000   061 040 141 015 040 142 015 012                                
           1       a  \r       b  \r  \n                                
0000010
$ 

Existem várias maneiras de corrigir os arquivos de entrada, além de dos2unix também podermos usar tr (embora seja uma péssima idéia se o arquivo usa a antiga tradição MacOS de \r como um delimitador de linha):

$ od -bc test1
0000000   061 040 141 015 012                                            
           1       a  \r  \n                                            
0000005
$ tr -d '\r' < test1 > foo
$ mv foo test1
$ od -bc test1            
0000000   061 040 141 012                                                
           1       a  \n                                                
0000004
$ 
    
por 18.04.2017 / 21:43

Tags