ディレクトリ内のファイルをリンクし、行の総数を見つけます。

ディレクトリ内のファイルをリンクし、行の総数を見つけます。

バッシュから:

ディレクトリ内のすべてのファイルをマージしてから、1つのコマンドを使用してすべての行の合計数を計算しようとしています。 |を使用して両方のコマンドをパイプできることに気づきました。

! cat /data/files *.txt >> mergedfile.txt | wc -l ~/data/files/mergedfile.txt

しかし、これはうまくいかないようです。私はbashを使ってiPythonで実行しています(したがって!)。

答え1

あなたの質問は少し混乱しています。

  • !シェルプロンプトを表すために使用しますか?これは非常に珍しいです。
  • .txtディレクトリ内のすべてのファイルについて話していますか/data/files?これを行うには、と言う必要があります/data/files/*.txt。他の意味があれば/data/files *.txt説明してください。
  • >> mergedfile.txt〜する追加mergedfile.txtすでに存在する場合は、ファイルを削除してください。あなたが欲しいものは何ですか?似たようなことをしたい場合は、質問にそれを言う必要があります。

とにかく言ったようにコメントの矢印を通して簡単で確実な解決策は、次のように|置き換えることです;

$ cat /data/files/*.txt >> mergedfile.txt; wc -l mergedfile.txt

メモ:

  • 上記のように、ファイルがすでに存在する場合は>>追加してください。mergedfile.txt古いコンテンツを無視(破棄)するには、代わりにをmergedfile.txt使用してください。>>>
  • 同じファイルを複数回参照する場合は、毎回同じ方法で実行する必要があります。一度は相対パス名を使用し、次に絶対パス名を使用すると混乱し、エラーが発生しやすくなります。 (ファイル名を変数に割り当てることで操作を簡素化できます。)

上記の内容に基づいて、いくつかの改善点は次のとおりです。

$ cat /data/files/*.txt > mergedfile.txt  &&  wc -l mergedfile.txt

&&に変更してください。これにより、コマンドが成功した場合にのみ実行され;ます。wc -lcat

上記の各コマンドラインは、2つの「パイプ」を含む「コマンドリスト」として説明されています(実際のパイプは含まれていません)。単一の「パイプライン」で行うには、次のようにします。

$ cat /data/files/*.txt | tee mergedfile.txt | wc -l

行数の計算ファイルをリンクするとき、 出力ファイルを読み込む必要はありません。既存の項目に追加するには、mergedfile.txtを使用しますtee -a

答え2

それが必要です:

! cat /data/files/*.txt >> mergedfile.txt && wc -l /data/files/mergedfile.txt

あなたのコマンドは2つのコマンドで構成されています。 1つ目は、cat出力をテキストファイルにリダイレクトすることです。 2番目は、結果ファイルの長さを計算することです。

最初のコマンドが成功した場合は、2つのコマンドを順番に実行する必要があります。だからちょうど&&チェーンを使用してください。このコマンドはにリダイレクトされstdoutた後にパイプを生成しません。だからそこを使用するのは間違っています。catmergedfile.txtcatstdoutwc|

または、あなたはできます:

! cat /data/files/*.txt | wc -l

これはより簡潔で、一時ファイルを使用しません。ここの出力はカウントcatに直接送信されます。wc

ノート、一時ファイルを使用する最初の方法には多くの欠点があります。

  • mergedfile.txt実行する前にファイルを消去する必要があります。起動時に作業ディレクトリにファイルがなくても問題ありません。ただし、一部のコマンドを最初に試してから(たとえば、誤ったコマンドを使用して)、一時ファイルを空にして正しいコマンドを実行することを忘れてしまうことが非常に一般的です。それでも間違った答えにつながります。実際にすべての行がある場合は、単に代わりに/data/files/*.txt使用できます。まずファイルを消去します。>>>
  • 一時ファイルは、コマンドの実行中に他のユーザーが変更したり、一部の操作を並行して実行したい場合は、直接変更することもできます。

また:後で使用する必要がある場合は、mergedfile.txt次のコマンドを使用してtee出力をコピーできます。

! cat /data/files/*.txt | tee mergedfile.txt | wc -l

teestdinそこに入れてmergedfile.txtコピーしてくださいstdout

関連情報