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