2012-03-02 5 views
1

ファイルがかなり長いです。最長行の長さは4609です。cshell:バックティック内の大きなテキストファイルでcatを実行すると「単語が長すぎます」

% perl -nle 'print length' ~/very_large_file | sort -nu | tail -1 
4609 

ここで、cat ~/very_large_fileを実行すると正常に動作します。私は内側のバッククォートを置くときしかし、それは言葉が長すぎる」というエラー

% foreach line (`cat ~/very_large_file`) 
Word too long. 

% set x = `cat ~/very_large_file` 
Word too long. 

は、このようなファイルの各行を処理するためにcshでバッククォートを使用する代わりはあります提供しますか?

更新私の問題は別の言語を使用して解決されましたが、まだ失敗したcshの理由が見つかりませんでした。 ARG_MAXを見つける方法を説明しているthisのページを見つけました。特に、getconfコマンドが便利です。もちろん、私はです。この制限が根本的な原因であるかどうか、そしてcsh以外の言語に制限が適用されるかどうかはまだ分かりません。です。

+2

各行で何をしていますか? (必然的に、誰かがあなたにhttp://www.faqs.org/faqs/unix-faq/shell/csh-whynot/を指摘するでしょう) –

+0

cshまたはtcshを使用していますか?私は1つの4609文字の行を持つファイルに対してtcsh 6.17.02を使用してこれを試しましたが、 "単語が長すぎます"というエラーはありませんでした。ファイル全体を '$ x'にスラーピングしても問題は残るかもしれません。しかし、あなたはPerlを持っているので、それを使わないのはなぜですか?これは、cshよりもはるかに優れたスクリプト言語です。 –

+0

私はこのシェルスクリプトを維持する必要があり、正直なところ私はそれをやるのに苦労している! foreachループは大部分のテキスト操作を行っていますが、このバグは最近になって現れました...はい、私はperlですべてを書き直すつもりですが、 'cat'演算を代用する方法があればバグのないものであれば、短期間で大きな助けになるでしょう。 – Unos

答えて

1

私は古い馬を打ち負かすつもりはありませんが、スクリプトを作成する場合は、bashzsh、またはKornに移動することを検討してください。 csh has disadvantages。あなたが定期的に古い(非常に古い)CSHとしている場合

  • 移動がtcshのために:あなたは完全にCSHを放棄せずに試すことができますどのような

  • tcshを長い単語長で再コンパイルしてください(デフォルトは1000バイトです)、または動的割り当てを使用します。
  • 二スクリプトまたはプログラムへのライン処理を移動し、このようにそのループの書き込み可能な場合:

    猫〜/ very_large_fileを| xargs secondary_script

+0

こんにちは...私はroot privelegesを持っていないので、私はtcshを再コンパイルできるかどうかわかりません...しかし、私はあなたの他の解決策を試して、戻ってくるでしょう... – Unos

+1

@Unosシェルを再構築して、これはカーネルのもので、おそらくあなたの ''インクルードファイルの 'NCARGS'か' ARG_MAX'なので、あなたを助けるつもりはありません。いくつかのカーネルは動的に成長することができますが、ほとんどはそうではありません。そして、あなたは常に 'xargs'アプローチを使うべきです。そうでなければ、標準からデータを読み込むような、代わりに入力します。 – tchrist

+0

@Unos:ソースから 'tcsh'をビルドし、ホームディレクトリのどこかにインストールするためのroot権限はありません。 –

関連する問題