파일 이름에 문자열을 추가하고 이를 열에 삽입하고 수정하려면 어떻게 해야 합니까?

파일 이름에 문자열을 추가하고 이를 열에 삽입하고 수정하려면 어떻게 해야 합니까?

다음 명령을 사용하여 22개의 파일을 만듭니다.

user@host$ awk '{ print $1, $3, $4, $5 }' chr22.gen > snps22
user@host$ awk '{ print $1, $3, $4, $5 }' chr21.gen > snps21
...
user@host$ awk '{ print $1, $3, $4, $5 }' chr1.gen > snps1

출력 파일은 다음과 같습니다.

user@host$ head snps21
rs885550 9887804 C T
rs169757 9928594 A C
rs210498 9928860 C T
rs210499 9929079 C A
rs303304 9941889 A G
...

내가 하고 싶은 것은 이러한 출력 파일( snps22, snps21, snps20...)을 수정하는 것입니다. 예를 들면 snps21다음과 같습니다.

user@host$ head snps21
rs885550 21:9887804:C:T
rs169757 21:9928594:A:C
rs210498 21:9928860:C:T
rs210499 21:9929079:C:A
rs303304 21:9941889:A:G
...

따라서 chr21.gen콜론을 사용하여 입력 파일 이름의 숫자(예: 21)를 출력 파일의 두 번째 열에 연결한 다음 콜론을 사용하여 두 번째, 세 번째 및 네 번째 열을 연결해야 합니다.

답변1

파일이 표시된 대로 정확하게 호출된다고 가정하면(예: 문자열 snps뒤에 염색체 이름이 오는 경우) 다음을 사용할 수 있습니다.

for name in snps*; do
    awk 'FNR == 1 { chr = substr(FILENAME, 5) }
         { printf("%s %s:%s:%s:%s\n", $1, chr, $2, $3, $4) }' "$name" >"$name.new"
done

그러면 다음과 같은 방법으로 파일 이름에서 염색체 이름이 추출됩니다 substr()(염색체 이름은 파일 이름의 5번째 문자부터 시작하는 모든 문자입니다). FNR == 1이 작업은 파일의 첫 번째 줄( )을 읽을 때만 수행 됩니다. 그런 다음 코드는 현재 줄을 원하는 형식으로 출력 printf()하고 염색체 이름을 포함합니다.

그런 다음 데이터는 .new파일 이름 접미사가 붙은 파일에 기록됩니다.

awk출력을 작성할 위치를 선택하여 셸 루프를 제거할 수 있습니다.

awk 'FNR == 1 { chr = substr(FILENAME, 5); name = FILENAME ".new" }
     { printf("%s %s:%s:%s:%s\n", $1, chr, $2, $3, $4) >name }' snps* 

모든 출력을 하나의 파일로 수집하시겠습니까? 충분 해

awk 'FNR == 1 { chr = substr(FILENAME, 5) }
     { printf("%s %s:%s:%s:%s\n", $1, chr, $2, $3, $4) }' snps* >all_snps

.gen수정된 변형을 가지고 있는 원본 파일 에 적용할 수도 있습니다 .

awk 'FNR == 1 { chr = substr(FILENAME, 4); sub("\.gen$", "", chr)
                name = "snps" chr }
     { printf("%s %s:%s:%s:%s\n", $1, chr, $3, $4, $5) >name }' chr*.gen

또는 단일 출력 파일의 경우

awk 'FNR == 1 { chr = substr(FILENAME, 4); sub("\.gen$", "", chr) }
     { printf("%s %s:%s:%s:%s\n", $1, chr, $3, $4, $5) }' chr*.gen >all_snps

데이터에서 약간 다른 열을 선택하고 염색체 이름을 찾으려면 파일 이름의 다른 부분을 추출하면 됩니다.

답변2

bash(및 sed 및 tr)를 사용해 빠르게 시도해 보세요.

for i in snps* 
do
  n=$(echo $i |tr -d 'a-zA-Z')
  sed -i -e "s/ / $n:/" -e 's/ \([A-Z]\)/:\1/g' $i
done

이것은 단지 snps2로 시작하는 파일 세트를 반복하고 각 파일에 대해 이름에서 모든 알파 문자를 제거하여 숫자 부분을 가져온 다음 sed(a)를 사용하여 첫 번째 공백을 숫자 부분인 공백으로 바꿉니다. file 이름과 콜론, (b) 대문자 뒤의 각 공백을 콜론으로 바꿉니다. 나는 awk를 사용하여 이 작업을 잘 수행할 수 있다고 확신합니다.

관련 정보