予期しないトークンの近くにコマンドが見つからず、構文エラーがあります。

予期しないトークンの近くにコマンドが見つからず、構文エラーがあります。

100,000行以上のファイルを50,000行に分割するスクリプトがあります。

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                                                     

実行すると、次のエラーメッセージが表示されます。

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$                                                 

誰でもこの問題を解決するのに役立ちますか?

答え1

最初のエラーメッセージ: command not foundは一般的な形式ではありませんbash: SOMECOMMAND: command not found。これは、怪しいことが起こっていることを示しています。

何が起こっているのかスクリプトに入力する特定の行末の文字。 Windowsでは、改行文字は2文字のシーケンスCR、LF(キャリッジリターンの後に改行)で表示されます。すべてのUnixバージョンでは、改行文字はLF文字でのみ表示されます。 Bashは、SOMECOMMAND␍wasのような行がCR文字であることを確認し、それをというコマンドへの呼び出しとして解析しますSOMECOMMAND␍。そのようなコマンドがないため、bashは一般的なエラーメッセージを表示します。

端末では、制御文字CRはカーソルを行の先頭に戻す。したがって、メッセージの残りの部分はコマンド名を上書きします。

修正方法は、Windowsエディタを使用してシェルスクリプトを編集するか、シェルスクリプトにCR文字を追加しないようにエディタを設定することです。

Linux または Cygwin の既存のファイルを Windows 行末から Unix 行末に変換するには、次のコマンドを使用します。ソースファイルにWindowsとUnix行の末尾が混在している場合でも機能します。

sed -i -e 's/\r$//' parte.sh

答え2

split(1)たとえば、を使用するsplit --lines=50000 pa.txtか、独自のプレフィックスを設定します。おそらく悪いよりもはるかに速いでしょう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.

答え3

これがshスクリプトの場合、関数定義にエラーがあるようです。

desc()
{

しなければならない:

function desc {

スクリプトの例:

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

関連情報