txt 파일 조작

txt 파일 조작

동일한 디렉토리에서 많은 txt 파일을 작동해야 합니다. 각 파일은 동일한 형식 이름(Pocket_????????.pdb_OUTPUT.txt) 및 동일한 내부 구조입니다.

다음은 예시입니다(파일 이름: Pocket_001_1b47_A.pdb_OUTPUT.txt).

Input PDB-File:         /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/1b47_A/1b47_biounit1_1b47_A.pdb
Pocket File:            /home/tommaso/Desktop/E3-ligase/CHAINS-approach/chains/1b47_A/Pocket_001_1b47_A.pdb
Pocket Surface:         649.1  
Hydrophobic Surface:    0.0     ( 0.0%)
Polar Surface:          441.0   (67.9%)
Acceptor Surface:       309.9   (47.7%)
Donnor Surface:         399.9   (61.6%)
Exposed To Solvent:     186.8   (28.8%)
Pocket Volume:          1255.9 
Hydrophobic Volume:     0.0     ( 0.0%)
Hydrophilic Volume:     229.1   (18.2%)
Flexible Volume:        134.2   (10.7%)
Rigid Volume:           120.2   ( 9.6%)
Buried Volume(B):       48.5    ( 3.9%)
Buried Volume(A):       0.0     ( 0.0%)

출력을 얻어야 합니다(Pocket_????????.pdb_OUTPUT_2.txt) 원본 파일의 이름과 각 줄에 있는 값을 원본 파일에 보고된 순서대로 쉼표로 구분하여 보고합니다.

예. 출력(Pocket_001_1b47_A.pdb_OUTPUT_2.txt):

Pocket_001_1b47_A.pdb_OUTPUT.txt,649.1,0.0,(0.0%),441.0,(67.9%),309.9,(47.7%),399.9,(61.6%),186.8,(28.8%),1255.9,0.0,( 0.0%),229.1,(18.2%),134.2,(10.7%),120.2,( 9.6%),120.2,( 9.6%),0.0,( 0.0%)

각 파일을 처리하고 각 파일에 대한 상대 출력 파일을 가져오려면 루프가 필요하다고 생각합니다.

누구든지 나를 도와줄 수 있나요? 감사합니다! ! !

답변1

노력하다,

for f in Pocket_??????????.pdb_OUTPUT.txt; do
    output=$(
        awk -F: 'NR>2{gsub("[[:blank:]]","",$2);print $2;}' "$f" \
        | sed 's/(/\n(/' \
        | paste -sd,
    )
    printf '%s,%s\n' "$f" "$output" >  "${f%.*}_2.txt"
done

설명하다:

  • 루프 파일 사용for f in ...; do ... done

루프 내에서 체인은 ...

  • awk -F: 'NR>2{gsub("[[:blank:]]", "", $2); print $2;}'처음 두 줄을 삭제하고 모든 공백과 탭을 제거합니다 $2.
  • sed새 줄 추가(
  • paste -sd,이전 내용을 csv로 만들기

그 다음에

  • "$f"다음 명령을 사용하여 파일 이름과 함께 넣으십시오.printf
  • 쓰기 "${f%.*}_2.txt"(삭제 .txt및 추가 _2.txt)

답변2

루프를 구현하지 않고도 이 작업을 수행할 수 있습니다. 와일드카드가 포함된 파일을 awk명령에 전달하면 됩니다.

awk -F':' '{$1 =""; sub(/^[ \t]+/, "");
           sub(/[ \t]+$/, "");
           sub(/[ \t]+/,",");
           printf("%s%s",FNR==1?"":",",$1) >> substr(FILENAME, 0, length(FILENAME)-4)"_2.txt"}' Pocket_*.pdb_OUTPUT.txt

설명하다

  • 먼저 콜론( $1 ="") 앞의 요소를 제거하고 sub(/^[ \t]+/, "")나머지 항목 앞( )과 뒤의 공백( )을 제거합니다.sub(/[ \t]+$/, "")
  • 요소 사이의 공백은 sub(/[ \t]+/,",")쉼표( )로 대체됩니다.
  • 마지막으로 수정된 입력을 사용하여 요소를 올바른 파일에 출력하고 요소가 FILENAME특정 파일의 첫 번째 줄이 아닌 경우 요소 사이에 쉼표를 추가합니다.

관련 정보