comando não encontrado e erro de sintaxe perto de token inesperado

3

Eu tenho este script para dividir um arquivo em 100000 ou até mais em 50000 linhas.

desc()                                                 
   {                                                   
   echo $1 $2|awk '{d=$1;}                             
   BEGIN {a=1;b=0}                                     
      { f=d"0"a;                                       
        while ((getline x<d)>0)                        
          { print x>>f".txt"                           
            if (b++>=50000)                            
               {                                       
                 close(f);b=0;a++;f=(a<10)?d"0"a:f=d""a
               }                                       
          }                                            
      }                                                
  END {print "Terminado ... ! "}'                      
  }                                                    

if [ -f $1 ]; then                                     
        desc $1 $2                                     
fi                                                     

Quando executo, recebo esta mensagem de erro:

sh-3.2$ parte.sh pa.txt                                 
: command not found                                     
'/parte.sh: line 2: syntax error near unexpected token '
'/parte.sh: line 2: 'desc()                             
sh-3.2$                                                 

Alguém pode ajudar a resolvê-lo?

    
por user49720 22.10.2013 / 23:06

3 respostas

4

A primeira mensagem de erro é : command not found , em vez do formato usual bash: SOMECOMMAND: command not found . Isso indica que algo suspeito está acontecendo.

O que está acontecendo é que o script contém caracteres retorno de carro no final de algumas linhas. No Windows, uma nova linha é representada pela sequência de dois caracteres CR, LF (retorno de carro seguido por avanço de linha). Em todos os sabores do Unix, uma nova linha é representada apenas pelo caractere LF. Bash vê uma linha como SOMECOMMAND␍ sendo é um caractere CR, que é analisado como uma chamada para o comando chamado SOMECOMMAND␍ . Como não existe tal comando, o bash exibe sua mensagem de erro usual.

No terminal, o caractere de controle CR move o cursor de volta para o começo da linha. Então o resto da mensagem substitui o nome do comando.

A correção não é usar um editor do Windows para editar scripts de shell ou configurar seu editor para não colocar caracteres CR em shell scripts.

Para converter um arquivo existente no Linux ou no Cygwin de finais de linha do Windows para finais de linha do Unix, você pode usar o seguinte comando. Ele funciona mesmo se o arquivo original tiver misturado finais de linha do Windows e do Unix.

sed -i -e 's/\r$//' parte.sh
    
por 23.10.2013 / 18:54
3

Use split(1) , por exemplo split --lines=50000 pa.txt (ou defina seu próprio prefixo). Provavelmente muito, muito mais rápido que o pobre awk .

DESCRIPTION
   Output  fixed-size  pieces of INPUT to PREFIXaa, PREFIXab, ...; default
   size is 1000 lines, and default PREFIX is 'x'.  With no INPUT, or  when
   INPUT is -, read standard input.
    
por 23.10.2013 / 02:24
-2

Se este é um script sh, parece que o erro está na sua definição de função.

desc()
{

Deve ser:

function desc {

Exemplo de script:

#!/bin/bash
function desc {
echo Hi e }
echo Starting e desc e echo Ending

    
por 22.10.2013 / 23:23