7

bash では、多くのファイル名の一部を抽出し、その出力を別のファイルに保存したいと考えています。

ファイルは、coffee_{SOME NUMBERS I WANT}.freqdist としてフォーマットされています。

#!/bin/sh
for f in $(find . -name 'coffee*.freqdist)

このコードはすべての coffee_{SOME NUMBERS I WANT}.freqdist ファイルを見つけます。では、{SOME NUMBERS I WANT} だけを含む配列を作成し、それをファイルに書き込むにはどうすればよいでしょうか?

ファイル1に書き込むと、行が次のように終わることを私は知っています。

  > log.txt

ファイル名のリストをフィルタリングする方法の中間部分がありません。

4

3 に答える 3

14

bash次のようにネイティブに実行できます。

filename=coffee_1234.freqdist
tmp=${filename#*_}
num=${tmp%.*}
echo "$num"

これは純粋な bash ソリューションです。外部コマンド ( などsed) は関与しないため、これはより高速です。

以下を使用して、これらの番号をファイルに追加します。

echo "$num" >> file

(ループを開始する前に、ファイルを削除/クリアする必要があります。)

于 2012-09-25T11:47:38.337 に答える
6

数値をファイルに書き込むだけの場合は、find コマンドは必要ありません。

ls coffee*.freqdist
coffee112.freqdist  coffee12.freqdist  coffee234.freqdist

以下は、ファイルにリダイレクトできるようにする必要があります。

$ ls coffee*.freqdist | sed 's/coffee\(.*\)\.freqdist/\1/'
112
12
234

達人。

于 2012-09-25T11:42:58.253 に答える
1

以前の回答は、いくつかの必要なテクニックを示しています。この回答は、他のジョブにも適用される可能性のある簡単な方法でパイプラインを整理します。(sedセパレータとして「;」をサポートしていない場合は、「;」を「|sed」に置き換えてください。)

$ ls */c*; ls c*
 fee/coffee_2343.freqdist
 coffee_18z8.x.freqdist  coffee_512.freqdist  coffee_707.freqdist
$ find . -name 'coffee*.freqdist' | sed 's/.*coffee_//; s/[.].*//' > outfile
$ cat outfile 
 512
 18z8
 2343
 707
于 2012-09-25T15:29:14.640 に答える