さまざまなファイルからブロックパターンを見つけ、そのファイルから特定の行を選択的に抽出します。

さまざまなファイルからブロックパターンを見つけ、そのファイルから特定の行を選択的に抽出します。

私は何万ものディレクトリを持っています。各ディレクトリの名前は数字で指定されます。たとえば、1, 2, 3,... 各ディレクトリには大きな .dat ファイルが含まれておりdata.dat、各ファイルには次のセクションがあります。

Configurations for Sm:

  Sm Nd H  O 

  0  1  4  0          1.00          7.14%
  1  0  3  0          3.00          7.14%
  0  0  5  0          1.00          7.14%

各行の最初の2つの数字に興味があります。私の考えでは:

  • で始まるすべての行(この場合は数字の最初の行)は、その行で始まる0 1ファイル名(番号)という名前の新しいファイルで終わります。0-1.dat以下は「例」と呼ばれる例です。
  • 同様に(ここでは2行目)で始まるすべての行は、その行1 0の先頭にあるファイル番号で呼び出されるファイルで終わる必要があります。1-0.dat
  • (ここでは3行目)で始まるすべての行は、0 0名前付きの行に移動する必要があります0-0.dat

必要な行を見つける複雑さは次のとおりです。

  • 場合によっては、行の1つが欠落しているか、行の順序が異なる場合があります。
  • また、各ファイルには名前のいくつかのセクションがありますConfigurations for X。ここで、Xは文字列です。したがって、どういうわけか識別子を使用し、Configurations for Sm:その下の最初の数値セットを検索する必要があります。

私が達成したいものの例では、行の最初の数字は、行が抽出されたファイルを含むディレクトリ名/番号です。

Example
In file called 0-1.txt:
1    0  1  4  0          1.00          7.14%
2    0  1  7  1          1.00          7.14%
3    0  1 ....

In file called 1-0.txt:
1    1  0  1  0          1.00          7.14%
2    1  0  4  2          1.00          7.14%
3    1  0 ....

私は現在以下を持っています:

find . -name data.dat -exec grep "Configurations for Sm:" {} + > 0-1.txt

しかし、これはすべて次のものをConfigurations for Sm:別のファイルに保存することです。どうすればいいのか分かりません。Configurations for Sm:数字の内容で以下の行を見つけてください。誰もがヒントを持っているか、私をオンラインリソースに導いてくれてありがとう。ありがとうございます。

ベストアンサー1

sedとを組み合わせて使ってもいいと思いますgrep

すべてのディレクトリ0、、、、...が次の場所にあるとします1(例:)。2/your/path/your/path/0/data.dat

for dir in /your/path/*; do
    idx=$(basename ${dir})
    sed -n '/Configurations for Sm:/,/Configurations for/p' ${dir}/data.dat | \
        grep '^ \+0 \+1' | \
        sed "s/^/${idx}/" >> "0-1.dat"
done

まず、sedファイルの興味深い部分(2つのモードConfigurations for Sm:とモードの間)のみを抽出する必要があります。Configurations for

grep行の先頭と一致します0 1(中央に正のスペースを含む)。

2 番目の sed は、行の先頭に「index」(ディレクトリ名)を追加します。

>>出力は「0-1.dat」に追加されます()。

0さまざまな合計の組み合わせをテストするために外部ループを追加できます1

注:私はこれを正しくテストしていません。

おすすめ記事