매우 복잡한 주기입니다. 누구든지 나를 도와줄 수 있나요?

매우 복잡한 주기입니다. 누구든지 나를 도와줄 수 있나요?

두 개의 입력 파일을 수시로 변경하면서 명령을 여러 번 실행해야 합니다. 아마도 "for" 같은 루프를 실행해야 할 것 같은데 어떻게 해야 할지 모르겠습니다. 명령은 다음과 같습니다.

"....." -ps -i xxxx_X.pdb -gl Pocket_nnn_xxxx_X.pdb -o output.txt 

두 개의 입력 파일은 옵션 -i과 옵션 이후의 파일이며 옵션에 대한 입력 파일이 해당 옵션에 대한 N개 파일(1과 10일 수 있음) 에 해당한다는 -gl점에서 서로 관련되어 있습니다 . 상관관계는 다음과 같습니다. 이름으로. 예를 들어 첫 번째 파일은 다음과 같습니다. 두 번째 파일 ... 동시에 다른 파일이 있을 수 있습니다 . 각 파일에 대한 명령을 반복하는 것 외에도 문제는 파일이 모두 동일한 디렉터리에 있지만 각 파일이 이름이 입력 파일 이름인 하위 디렉터리에 있다는 것입니다. 예를 들어, 위에서 언급한 두 개의 입력 파일을 포함하여 여러 파일을 포함하는 하위 디렉터리가 있는 이라는 디렉터리가 있습니다 . 또한 각 명령은 다음과 같은 출력 파일을 생성합니다.-i-gl1crt_A.pdbPocket_001_1crt_A.pdbPocket_002_1crt_a.pdb-iALL1crt.A

Input PDB-File:         1crt_A.pdb
Pocket File:            Pocket_001_1crt_A.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     92.0    (22.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5

생성된 각 파일 출력(라인 2, 열 2( ))을 추출하고 Pocket_001_1crt_A.pdb이를 새 텍스트 파일( )에 복사하고 SUMMARY_ALL.txt라인 8( ) 및 9( ) 열 2 및 3에 있는 정보를 동일한 라인에 보고하려고 합니다. 파일은 다음과 같아야 합니다:AAAAABBBBB

                        AAAAAA   AAAAA(%)   BBBBBB
Pocket_001_1crt_A.pdb   92.0     (22.7%)     536.6 

생성된 모든 출력 파일에 대해 마지막 작업을 수행하고 관심 있는 부분을 동일한 파일에 복사해야 합니다( SUMMARY_ALL.txt).

다음은 일반적인 파일입니다.

기본 디렉터리: home/Desktop/Work이 디렉터리 아래에는 많은 디렉터리가 있으며 work이러한 디렉터리의 이름은 다음과 같습니다 XXXX_X(예: 2ert_A, 7rtf_3, 9yhj_B....). 각 디렉터리에는 이라는 이름의 파일 XXXX_X.pdb과 .라는 이름의 파일이 하나 이상 있습니다 Pocket_nnn_XXXX_X.pdb.

예: - home/Desktop/Work/2ert_A및가 있는 2ert_A.pdb경우 Pocket_001_2ert_A.pdb - , , 및 home/Desktop/Work/7rtf_3있는 경우7rtf_3.pdbPocket_001_7rtf_3.pdbPocket_002_7rtf_3.pdbPocket_003_7rtf_3.pdb

모든 디렉토리는 동일합니다.XXXX_X

XXXX_X원하는 각 디렉토리 에 대해 다음을 사용하십시오.

'....' -ps -i xxxx_X.pdb -gl Pocket_nnn_xxxx_X.pdb -o Pocket_nnn_xxxx_X_OUTPUT.txt 

여기서 file 입력 -i( XXXX_X.pdb)는 항상 동일하고 file -gl( )은 변경됩니다( 라는 디렉터리에 파일이 더 있는 경우에만 해당 Pocket_nnn_XXXX_X.pdb하고 그렇지 않으면 명령줄은 한 번만 적용됩니다).XXXX_XPocket_nnn_XXXX_X.pdb

명령줄이 적용될 때마다 각 파일에 대해 다음과 같이 Pocket_nnn_XXXX_X.pdb파일 출력( )이 생성됩니다 .Pocket_nnn_xxxx_X_OUTPUT.txt

Input PDB-File:         XXXX_X.pdb
Pocket File:            Pocket_nnn_XXXX_X.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     92.0    (22.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5

SUMMARY_ALL.txt내 목표는 각 파일의 정보와 관련된 모든 줄을 포함하는 텍스트 파일( )을 만드는 것입니다 .AAAAAAAPocket_nnn_xxxx_X_OUTPUT.txt

예를 들어, 디렉토리가 두 개만 있는 경우 2ert_A다음 7rtf_3과 같이 작동합니다.

  • 있고home/Desktop/Work/2ert_A2ert_A.pdbPocket_001_2ert_A.pdb

명령줄:

'....' -ps -i 2ert_A.pdb -gl Pocket_001_2ert_A.pdb -o Pocket_001_2ert_A_OUTPUT.txt 

문서 Pocket_001_2ert_A_OUTPUT.txt:

Input PDB-File:         2ert_A.pdb
Pocket File:            Pocket_001_2ert_A.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     92.0    (22.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5
  • , , home/Desktop/Work/7rtf_3가 있습니다 .7rtf_3.pdbPocket_001_7rtf_3.pdbPocket_002_7rtf_3.pdbPocket_003_7rtf_3.pdb

명령줄:

'....' -ps -i 7rtf_3.pdb -gl Pocket_001_7rtf_3.pdb -o Pocket_001_7rtf_3_OUTPUT.txt

문서 Pocket_001_2ert_A_OUTPUT.txt:

Input PDB-File:         7rtf_3.pdb
Pocket File:            Pocket_001_7rtf_3.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     80.0   (10.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5 

또 다른 명령줄:

'....' -ps -i 7rtf_3.pdb -gl Pocket_002_7rtf_3.pdb -o Pocket_002_7rtf_3_OUTPUT.txt

문서 Pocket_002_2ert_A_OUTPUT.txt:

Input PDB-File:         7rtf_3.pdb
Pocket File:            Pocket_002_7rtf_3.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     50.0    (1.5%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5 

명령줄의 마지막 줄:

'....' -ps -i 7rtf_3.pdb -gl Pocket_003_7rtf_3.pdb -o Pocket_003_7rtf_3_OUTPUT.txt

문서 Pocket_003_2ert_A_OUTPUT.txt:

Input PDB-File:         7rtf_3.pdb
Pocket File:            Pocket_003_7rtf_3.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     65.0    (75.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5 

최종 파일은 ALL_SUMMAY.txt다음과 같아야 합니다.

Pocket_001_2ert_A.pdb     92.0    (22.7%)
Pocket_001_7rtf_3.pdb     80.0   (10.7%)
Pocket_002_7rtf_3.pdb     50.0    (1.5%)
Pocket_003_7rtf_3.pdb     65.0    (75.7%)

Pocket_nnn_XXXX_X_OUTPUT.txt작업 디렉터리( )에 모든 내용을 저장 해야 합니다 XXXX_X. 파일은 ALL_SUMMARY.txt이 디렉토리에 저장될 수 있습니다 home/Desktop/Work/.

답변1

귀하의 사양을 이해한다면 – 불일치에 대해 너무 명확하지는 않지만 – 정확합니다. 두 개의 루프가 필요합니다

a) 기본 .pdb 파일을 찾고,

b) 관련 포켓 파일.

파일을 생성하고 이전 버전을 덮어쓴 후 를 output.txt사용하여 awk결과 파일에 필수 필드를 추출합니다. cded int dir 후에 ALL시도하십시오.

for FN1 in *.pdb                                                                # loop across all .pdb files
  do    PN="${FN1##*/}"
        PN="${PN%.pdb}"                                                         # construct subdir name
        for FN2 in "${PN/_/.}"/*.pdb                                            # 2nd loop across .pdb files in subdir
          do    "....." -ps -i "$FN1" -gl "$FN2" -o output.txt                  # create output.txt in parent dir
                awk -F: 'FNR == 2  ||                                           # extract desired fields
                         /^AAAAA/  ||
                         /^BBBBB/       {sub (/^ */, "", $2)
                                         printf "%20s%s", $2, /^BBBB/?"\n":""
                                        }
                        ' output.txt >> SUMMARY_ALL.txt                         # and append to result file
          done
  done

결과 파일에 대한 외관 수정(예: 인쇄 헤더, 행 형식)은 독자에게 맡겨집니다.

답변2

이 문제를 해결하기 위한 아이디어는

  • cd기본 디렉토리로home/Desktop/Work
  • 모든 디렉토리를 순환합니다 ????_?(루프 변수 dir).
    • 일치하는 파일이 있는 경우$dir.pdb
      • cd디렉토리 입력$dir
      • 모두 반복Pocket_*_$dir.pdb
        • 명령을 실행하여 데이터를 처리하고 해당 출력 파일을 생성합니다.
        • 출력 파일에서 stdout으로 데이터를 성공적으로 추출한 경우
      • cd상위 디렉터리로 돌아가야 하는 경우
  • 이 루프의 출력(즉, 추출된 모든 데이터)을ALL_SUMMARY.txt
cd home/Desktop/Work
# edit: remove old summary file because now the script will append to it
rm SUMMARY_ALL.txt
for dir in ????_?
do
    if [ -f "$dir/$dir.pdb" ]
    then
        cd "$dir"
        for pocket in Pocket_*_"$dir.pdb"
        do
            out="${pocket%.pdb}_OUTPUT.txt"
            # edit: if the command '....' prints output this will end up in the summary file
            # '....' -ps -i "$dir.pdb" -gl "$pocket" -o "$out" && awk '/Pocket File:/ {pocket=$NF} /AAAAAAAAAAAAAAAAAA:/ {aaa1=$(NF-1);aaa2=$NF} /BBBBBBBBBBBBB:/ {bbb=$NF} END {print pocket,aaa1,aaa2,bbb}' "$out"
            '....' -ps -i "$dir.pdb" -gl "$pocket" -o "$out" && awk '/Pocket File:/ {pocket=$NF} /AAAAAAAAAAAAAAAAAA:/ {aaa1=$(NF-1);aaa2=$NF} /BBBBBBBBBBBBB:/ {bbb=$NF} END {print pocket,aaa1,aaa2,bbb}' "$out" >> ../SUMMARY_ALL.txt
        done
        cd ..
    fi
# edit: avoid putting other output into summanry file
# done > SUMMARY_ALL.txt
done

노트:

이 코드는 테스트되지 않았습니다.

&&출력 파일을 생성하는 명령은 이 명령과 awk데이터를 추출하는 명령 사이에 사용하기 위해 성공 시 상태 0, 오류 시 !=0으로 종료된다고 가정합니다 .

awk명령은 단일 파일을 처리하는 데에만 적합합니다. (여기서는 이렇게 사용합니다.) 한 번에 모든 출력 파일을 처리하려면 스크립트를 변경해야 합니다.

관련 정보