gawk 디렉터리의 파일 목록을 구문 분석하고 새 폴더에 저장합니다.

gawk 디렉터리의 파일 목록을 구문 분석하고 새 폴더에 저장합니다.

안녕하세요 다음 코드가 있습니다

for i in *.dssp ; do
   gawk 'BEGIN{ FIELDWIDTHS = "5 5 1 1 4 1 *"} $4 == "A" {s=s$6} END {print s}' | tr "[HGI]" "H" | tr "[BE]" "E" | tr "[TS ' ']" "C" 
done 

특정 .dssp 파일을 사용하여 셸에서 코드를 호출하여 성공적으로 실행할 수 있지만 이러한 파일의 디렉터리가 있고 모든 파일을 반복하고 출력을 저장하는 데 필요합니다. 이는 여러 문자입니다(fasta 등)을 새 파일에 추가하고 해당 ID를 추출합니다. 여기서 어디로 가야할지 모르겠어요

답변1

여기에서는 awk만 사용합니다.

gawk -v map='[GI]>H,B>E,[TS ]>C' '
BEGIN  { nrf=split(map, tmp, /[,>]/); FIELDWIDTHS="5 5 1 1 4 1 *" }

$4=="A"{ buf= buf $6 }

ENDFILE{
    for(i=1; i<=nrf; i+=2) gsub(tmp[i], tmp[i+1], buf);
    print buf >FILENAME".output"; close(FILENAME".output"); buf=""
}' ./*.dssp

여기서는 문자 맵 변환을 -v map='[GI]>H,B>E,[TS ]>C'awk에 변수 인수(쉼표로 구분된 각 문자, 각 맵 그룹 간의 가독성을 향상시키는 데에도 사용됨)로 전달합니다.>

그런 다음 BEGIN{} 블록 내에서 매핑을 다음과 분리합니다.map변수를 임시 배열로tmp그리고 이러한 합계를 구분 기호 ,로 처리합니다 >. 또한 FIELDWIDTHS(GNU awk)를 통해 필드를 정의합니다.

다음으로 네 번째 필드가 "A" 문자 와 같은지 확인하고 , 그렇다면 추가 모드에서 각 줄의 여섯 번째 필드를 버퍼링하여buff바꾸다.

각 입력 파일의 끝에서 ENDFILE{} 블록(GNU awk)을 처리합니다. 여기서는 문자 맵 쌍을 반복하고 왼쪽 문자를 오른쪽 문자로 바꿉니다.buff변경 가능; 나중에 업데이트된 내용을 인쇄합니다.buff입력과 이름이 같은 출력 파일에 콘텐츠를 추가하고 "fileName.output"과 같은 접미사를 추가합니다.

관련 정보