특정 데이터를 다른 디렉터리의 여러 파일로 추출

특정 데이터를 다른 디렉터리의 여러 파일로 추출

나는 꽤 복잡한 것을 하려고 노력하고 있지만, 가능한 한 간단하게 설명하려고 노력할 것입니다. 내 Linux 컴퓨터에는 서로 다른 이름을 가진 많은 디렉터리가 있지만 모두 동일한 형식(예: 1trg_A -> ????_?)을 갖고 있으며 각 폴더에는 동일한 방식으로 호출되는 하나 이상의 파일이 있습니다(그들 사이의 참조 코드는 다르며 다음에 연결됩니다). 이름) 폴더: 예를 들어 Pocket_001_1trg_A.pdb_OUTPUT.txt). 따라서 각 폴더에는 각각 다음과 같은 ????_?이름의 파일이 하나 이상 있습니다 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%) 값을 추출하려고 합니다.

이는 각 파일에 대해 수행되어야 하며 모든 데이터를 하나의 출력 파일에 저장합니다. 예를 들어, 그 안에 두 개의 서로 다른 디렉터리( 2ert_B6yus_1)와 두 개의 서로 다른 파일( 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~"Solvent"

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

일치하는 항목이 발견되면 분할된 비트 수가 저장 split되고 파일 이름(in )과 원하는 데이터가 저장 되며 더 이상 처리가 필요하지 않습니다. 개별적으로 찾은 각 파일에 대해 개별적으로 이 작업을 수행합니다.FILENAMEbits[]/lastprintbits[last]$2exitawk{}\;

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

하지만 결국 입력한 후에는@renaud globstar와 함께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%)

단지 순서가 다를 뿐이죠.

관련 정보