Shell-Script
在許多不同的文件中查找塊模式並有選擇地從中提取某些行
我有數以萬計的目錄。每個目錄都按數字命名,例如
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
。注意:我沒有正確測試這個。