Shell-Script

在許多不同的文件中查找塊模式並有選擇地從中提取某些行

  • December 18, 2019

我有數以萬計的目錄。每個目錄都按數字命名,例如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%

我關心每行的前兩個數字。我想:

  • 所有以0 1(在此範例中,即第一行數字)0-1.dat開頭的行都將在一個新文件中結束,該文件以行首的文件名(數字)命名。下面是一個範例,稱為“範例”。
  • 同樣,所有以1 0(這裡是第二行)開頭的行都應該在一個文件中結束,該文件1-0.dat以行首的文件號呼叫。
  • 所有以(這裡是第三行)開頭0 0的行都應該轉到一個名為0-0.dat.

找到我需要的線路的並發症是:

  • 有時其中一行可能會失去,或者這些行的順序可能不同。
  • 此外,每個文件都有許多名為 的部分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:通過它們的數字內容在下面找到行。如果有人有任何提示或可以將我引導到線上資源,我將非常感激。謝謝你。

我認為您可以使用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應該只提取文件中感興趣的部分(在兩個模式Configurations for Sm:和之間Configurations for

grep``0 1在行首匹配(中間有正數的空格)

第二個 sed 在行首添加“索引”(目錄名稱)。

輸出附加 ( >>) 到“0-1.dat”。

您可以添加一個外部循環來測試0和的不同組合1

注意:我沒有正確測試這個。

引用自:https://unix.stackexchange.com/questions/557118