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

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

バッシュから:

ディレクトリ内のすべてのファイルをマージしてから、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

おすすめ記事