두 개의 입력 파일을 수시로 변경하면서 명령을 여러 번 실행해야 합니다. 아마도 "for" 같은 루프를 실행해야 할 것 같은데 어떻게 해야 할지 모르겠습니다. 명령은 다음과 같습니다.
"....." -ps -i xxxx_X.pdb -gl Pocket_nnn_xxxx_X.pdb -o output.txt
두 개의 입력 파일은 옵션 -i
과 옵션 이후의 파일이며 옵션에 대한 입력 파일이 해당 옵션에 대한 N개 파일(1과 10일 수 있음) 에 해당한다는 -gl
점에서 서로 관련되어 있습니다 . 상관관계는 다음과 같습니다. 이름으로. 예를 들어 첫 번째 파일은 다음과 같습니다. 두 번째 파일 ... 동시에 다른 파일이 있을 수 있습니다 . 각 파일에 대한 명령을 반복하는 것 외에도 문제는 파일이 모두 동일한 디렉터리에 있지만 각 파일이 이름이 입력 파일 이름인 하위 디렉터리에 있다는 것입니다. 예를 들어, 위에서 언급한 두 개의 입력 파일을 포함하여 여러 파일을 포함하는 하위 디렉터리가 있는 이라는 디렉터리가 있습니다 . 또한 각 명령은 다음과 같은 출력 파일을 생성합니다.-i
-gl
1crt_A.pdb
Pocket_001_1crt_A.pdb
Pocket_002_1crt_a.pdb
-i
ALL
1crt.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에 있는 정보를 동일한 라인에 보고하려고 합니다. 파일은 다음과 같아야 합니다:AAAAA
BBBBB
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.pdb
Pocket_001_7rtf_3.pdb
Pocket_002_7rtf_3.pdb
Pocket_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_X
Pocket_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
내 목표는 각 파일의 정보와 관련된 모든 줄을 포함하는 텍스트 파일( )을 만드는 것입니다 .AAAAAAA
Pocket_nnn_xxxx_X_OUTPUT.txt
예를 들어, 디렉토리가 두 개만 있는 경우 2ert_A
다음 7rtf_3
과 같이 작동합니다.
- 있고
home/Desktop/Work/2ert_A
2ert_A.pdb
Pocket_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.pdb
Pocket_001_7rtf_3.pdb
Pocket_002_7rtf_3.pdb
Pocket_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
결과 파일에 필수 필드를 추출합니다. cd
ed 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
명령은 단일 파일을 처리하는 데에만 적합합니다. (여기서는 이렇게 사용합니다.) 한 번에 모든 출력 파일을 처리하려면 스크립트를 변경해야 합니다.