バッシュから:
ディレクトリ内のすべてのファイルをマージしてから、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 -l
cat
上記の各コマンドラインは、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
た後にパイプを生成しません。だからそこを使用するのは間違っています。cat
mergedfile.txt
cat
stdout
wc
|
または、あなたはできます:
! 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
tee
stdin
そこに入れてmergedfile.txt
コピーしてくださいstdout
。