0

※ラインストリーミングで一行ずつ読みたいのでsedを使う目的。

unix の bash と ruby​​ についていくつか質問がありますが、bash の構文については本当に混乱しています。すべての応答に感謝します。

1.コマンドラインでserver.txtを読み込んで、サーバーの内容で無意味に並べ替えたいとしましょう

これはserver.txtがどのように見えるかです

太平洋
アジア
北米
アメリカ

ここに私が入力したもの

sed -e server.txt |sort| > done.txt

しかし、それはうまく機能していないようです、それを修正するにはどうすればよいですか?

2.2 つ目の質問は、unix コマンドと ruby​​ スクリプトをどのように組み合わせるかということです。ファイルにストリーミングしてから、ルビーファイルに1行ずつ入力したいのと同じです。そして、いくつかのファイルに出力します。私は試した

sed -e server.txt ruby filter.rb > done.txt

これもうまくいきません。

3. $stdin $stdout とはどういう意味ですか?

4.server.txt が 10 GB のようにメモリに収まらない場合でも、並べ替えを使用できますか? またはソートは、ストリーミングとマージを自動的に行うようなものですか?

4

1 に答える 1

2
  1. 入力した内容が正確である場合:

    sed -e server.txt |sort| > done.txt
    

    sed'server.txt' に 3 番目の 'e' がないことを訴えると、構文エラーが発生するはずです(これは、式の区切り文字として 'e' を使用して代替コマンドを作成しようとする試みとして扱われるためです。-eオプションは、次の引数はコマンド式であり、ファイル名ではありません)。

    2 番目のパイプは省略してください。書かれているように、ファイルを作成してから何もしない null コマンドを呼び出しましたdone.txtcat出力をファイルに書き込む場合は、またはteeコマンドをそこに入れる必要があります。sortまたは、ファイルに書き込むように 2 番目のパイプを省略したほうがよいでしょう。

    最初の例を機能させる方法catまたは使用する方法の例を挙げていただけますか?tee

    sed -e s/a/b/g server.txt | sort | cat > done.txt  # UUOC award
    sed -e s/a/b/g server.txt | sort | tee   done.txt
    sed -e s/a/b/g server.txt | sort       > done.txt  # No UUOC award
    sed -e s/a/b/g server.txt | sort      -o done.txt  # No UUOC award
    

    sedファイルを読み取るための式を追加しましたserver.txtUUOCは「猫の無駄使い」賞です。例で使用する必要はまったくありませんcattee過去にスクロールするときに 10 GiB のデータすべてを読み取ることを計画している場合は、使用が理にかなっている可能性があります。それ以外の場合は、最後の 2 つのオプションのいずれかがより賢明です。このコンテキストでは、それらは本質的に同等です。

  2. 2 番目のコマンド:

    sed -e server.txt ruby filter.rb > done.txt
    

    次のように記述します。

    sed -e s/a/b/g server.txt | ruby filter.rb > done.txt
    

    ;の-eオプションにばかげたアクションを提供しました。sedの出力はスクリプトにsedパイプされruby、出力は に書き込まれdone.txtます。これは非常に標準的なイディオムです。

  3. これ以上の文脈がなければ、私はあなたに何$stdin$stdout意味するのかを伝えることができません. 言語によって意味が少し異なりますが、通常は何らかの変数への参照になります。これら 2 つの名前を特別なものとして扱う言語があるかどうかはわかりません。おそらくいくつかありますが、Perl もシェルも、それらの名前に特別な意味はありません。

于 2012-09-06T03:48:14.837 に答える