Eu vejo na minha bola de cristal que o arquivo de entrada foi preparado no Windows.
Aposto que o personagem não é um ponto de interrogação, é apenas a maneira de ls
de dizer a você que existe um personagem não imprimível. O caractere não imprimível em questão é um caractere de retorno de carro (CR, comumente representado como \r
ou 5
ou ^M
).
Um caractere CR aparece no final das linhas de arquivos de texto que foram produzidos no Windows. Windows e Unix representam arquivos de texto de maneira diferente: o Unix usa o caractere LF ( \n
, 2
, ^J
) como um terminador de linha (ou seja, cada linha consiste em caracteres imprimíveis seguidos por LF), enquanto o Windows usa seqüência de caracteres CR-LF como um separador de linha (ou seja, cada linha consiste em seus caracteres imprimíveis seguidos por CR seguido por LF, exceto que a última linha geralmente consiste apenas em caracteres imprimíveis). Então, quando você copia um arquivo de texto do Windows para um sistema Unix, ele tem esse caractere CR falso no final de cada linha, exceto às vezes o último. No que diz respeito ao Linux ou a outros sistemas Unix, o caractere CR é um caractere comum (embora não imprimível), portanto, ele permanece lá e causa problemas.
Você deve converter o arquivo para um arquivo de texto Unix. No Linux, você pode usar
sed -i -e 's/\r$//' /path/to/file
Como alternativa, para fazer uma cópia limpa, você pode usar
</path/to/windows/file tr -d '\r' >/path/to/unix/file
Se você preferir tornar seu script robusto, remova o CR ao ler o arquivo:
set fbase = 'head -$iev stationlist1.csv | tail -1 | tr -d '\r''