特定のデータを別のディレクトリの複数のファイルに抽出する

特定のデータを別のディレクトリの複数のファイルに抽出する

私はかなり複雑なことをしようとしていますが、できるだけ簡単に説明しようとします。私のLinuxコンピュータには異なる名前を持つ多くのディレクトリがありますが、すべて同じ形式(たとえば)を持ち、1trg_A -> ????_?各フォルダには同じ方法で呼び出される1つ以上のファイルがあります(それらの間の参照コードは異なり、次にリンクされます)。名前)フォルダ:例えばPocket_001_1trg_A.pdb_OUTPUT.txt)。したがって、各フォルダには、それぞれ次の????_?名前のファイルが1つ以上ありますPocket_***_????_?.pdb_OUTPUT.txt

input PDB-File:         /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/1trg_A/1b47_A.pdb
Pocket File:            /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/1trg_A/Pocket_001_1trg_A.pdb
Pocket Surface:         460.7  
Hydrophobic Surface:    54.6    (11.8%)
Polar Surface:          291.4   (63.2%)
Acceptor Surface:       226.7   (49.2%)
Donnor Surface:         163.7   (35.5%)
Exposed To Solvent:     133.3   (28.9%)
Pocket Volume:          1044.6 
Hydrophobic Volume:     11.0    ( 1.1%)
Hydrophilic Volume:     199.1   (19.1%)
Flexible Volume:        203.3   (19.5%)
Rigid Volume:           51.9    ( 5.0%)
Buried Volume(B):       32.5    ( 3.1%)
Buried Volume(A):       0.0     ( 0.0%)

各ディレクトリに対して、各ファイルからポケット名(例:)Pocket_001_1trg_A.pdbと「溶媒にさらされる」(Pocket_001_1trg_A.pdb 133.3 28.9%)の値を抽出しようとしています。

これは各ファイルに対して実行する必要があり、すべてのデータを1つの出力ファイルに保存します。たとえば、2つの異なるディレクトリ(および2ert_B6yus_1と2つの異なるファイル(Pocket_001_2ert_B.pdb_OUTPUT.txtと)があるとしますPocket_003_6yus_1.pdb_OUTPUT.txt

Pocket_001_2ert_B.pdb_OUTPUT.txt:

input PDB-File:         /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/2ert_B/2ert_B.pdb
Pocket File:            /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/2ert_B/Pocket_001_2ert_B.pdb
Pocket Surface:         460.7  
Hydrophobic Surface:    54.6    (11.8%)
Polar Surface:          291.4   (63.2%)
Acceptor Surface:       226.7   (49.2%)
Donnor Surface:         163.7   (35.5%)
Exposed To Solvent:     125.4   (49.9%)
Pocket Volume:          1044.6 
Hydrophobic Volume:     11.0    ( 1.1%)
Hydrophilic Volume:     199.1   (19.1%)
Flexible Volume:        203.3   (19.5%)
Rigid Volume:           51.9    ( 5.0%)
Buried Volume(B):       32.5    ( 3.1%)
Buried Volume(A):       0.0     ( 0.0%)

Pocket_003_6yus_1.pdb_OUTPUT.txt:

input PDB-File:         /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/6yus_1/26yus_1.pdb
Pocket File:            /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/6yus_1/Pocket_003_6yus_1.pdb
Pocket Surface:         460.7  
Hydrophobic Surface:    54.6    (11.8%)
Polar Surface:          291.4   (63.2%)
Acceptor Surface:       226.7   (49.2%)
Donnor Surface:         163.7   (35.5%)
Exposed To Solvent:     45.3   (22.4%)
Pocket Volume:          1044.6 
Hydrophobic Volume:     11.0    ( 1.1%)
Hydrophilic Volume:     199.1   (19.1%)
Flexible Volume:        203.3   (19.5%)
Rigid Volume:           51.9    ( 5.0%)
Buried Volume(B):       32.5    ( 3.1%)
Buried Volume(A):       0.0     ( 0.0%)

"output.txt"ファイルは次のとおりです。

Pocket_001_2ert_B.pdb 125.4   49.9%
Pocket_003_6yus_1.pdb 45.3   22.4%

私は何をすべきかわからず、それが明確で、私よりも経験豊富な誰かが私を助けることができることを願っています。ありがとうございます。

答え1

gnu grep、sed、および3つのディレクトリを使用してbashで作業しているとします。

$ ls
1trg_A  2ert_B  6yus_1

Bashでglobstar機能を使用できます(**)

$ ls **/Pocket_*.pdb_OUTPUT.txt
1trg_A/Pocket_001_1trg_A.pdb_OUTPUT.txt  2ert_B/Pocket_001_2ert_B.pdb_OUTPUT.txt  6yus_1/Pocket_003_6yus_1.pdb_OUTPUT.txt

grepを使って目的の行を見つけるだけです。

$ grep -e '^Exposed To Solvent:' **/Pocket_*.pdb_OUTPUT.txt
1trg_A/Pocket_001_1trg_A.pdb_OUTPUT.txt:Exposed To Solvent:     133.3   (28.9%)
2ert_B/Pocket_001_2ert_B.pdb_OUTPUT.txt:Exposed To Solvent:     125.4   (49.9%)
6yus_1/Pocket_003_6yus_1.pdb_OUTPUT.txt:Exposed To Solvent:     45.3   (22.4%)

次に、sedを使用して抽出された行を変更する必要があります。完全なコマンドは次のとおりです。

$ grep -e '^Exposed To Solvent:' **/Pocket_*.pdb_OUTPUT.txt | sed -e 's/^.*\(Pocket.*\.pdb\).*:/\1/;s/[()]//g' >myfile
$ cat myfile
Pocket_001_1trg_A.pdb     133.3   28.9%
Pocket_001_2ert_B.pdb     125.4   49.9%
Pocket_003_6yus_1.pdb     45.3   22.4%

注:2ert_BフォルダにPocket_001_1trg_A.pdb_OUTPUT.txtファイルがないとします。

答え2

私はこれfindに到達することはできませんでしたawk

find . -type f -name "Pocket*.pdb" -exec awk -F: '$1~"Solvent"{last = split(FILENAME, bits, "/"); print bits[last],$2}' {} \;

Pocket_003_6yus_1.pdb      45.3   (22.4%)
Pocket_001_2ert_B.pdb      125.4   (49.9%)

パターンに一致するすべてのファイルで. find次のコードを使用します。-type f-name"Pocket*.pdb"-exec

find . -type f -name "Pocket*.pdb" -exec

awk-F:興味のあるテキストが見つかるまで、フィールド区切り文字を使用して各ファイルを1行ずつ繰り返します。$1~"Solvent"

  awk -F: '$1~"Solvent"{

一致するものが見つかると、分割されたビット数が保存さsplitれ、ファイル名(in)と必要なデータが保存され、処理は不要になります。個別に見つかった各ファイルに対して個別にこれを行います。FILENAMEbits[]/lastprintbits[last]$2exitawk{}\;

    last = split(FILENAME, bits, "/"); print bits[last],$2; exit 1}' {} \;

しかし、最終的に入力した後@renaudglobstarと一緒にawk

awk -F: '$1~"Solvent"{last = split(FILENAME, bits, "/"); print bits[last],$2; exit 1}' **/Pocket*.pdb

Pocket_001_2ert_B.pdb      125.4   (49.9%)
Pocket_003_6yus_1.pdb      45.3   (22.4%)

ただ順序が違うだけです。

関連情報