처음 두 필드는 _로 구분되고 나머지 필드는 그대로 유지됩니다.

처음 두 필드는 _로 구분되고 나머지 필드는 그대로 유지됩니다.
#CHROM  POS     REF     ALT     ../S101_sorted.bam      ../S102_sorted.bam          ../S105_sorted.bam      ../S107_sorted.bam      ../S113_sorted.bam      ../S114_sorted.bam      ../S115_sorted.bam      ../S
Aradu.A01       296611  T       C       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T/C     T       T/C     T       T       T       T
Aradu.A01       326689  T       C       T/C     T       T       T       T/C     T       T       T       T/C     T/C     T       T       T       T       T       T       T       T/C     T/C     T       T
Aradu.A01       615910  T       G       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01       661394  T       A       T       T       T       T       T       T/A     T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01       941674  C       T       C       C/T     C       C       C/T     C       C       C       C       C       C       C       C       C       C       C       C       C       C       C       C
Aradu.A01       942064  C       T       C/T     C/T     C/T     C/T     C/T     C       C       C/T     C       C/T     C/T     C       C       C/T     C/T     C       C       C       C       C/T     C/T
Aradu.A01       954858  G       A       G/A     G       G       G       G       G       G       G       G       G       G       G       G       G       G       G       G/A     G       G       G       G
Aradu.A01       1196780 C       A       C/A     C       C       C       C       C       C       C       C       C       C       C/A     C       C       C/A     C       C       C       C       C       C

위 형식의 파일이 있고 _나머지 열로 구분된 처음 두 열을 그대로 인쇄하려고 합니다. 다음 스크립트를 시도했지만 awk출력이 반환되지 않습니다.

awk '{if (NR>1) print $1"_"$2; for(i=3;i<NF;i++) printf "\t", $i}' input_file > out_file.

누구든지 내가 여기서 뭘 잘못하고 있는지 제안할 수 있나요?

답변1

처음 두 열 사이의 공간을 밑줄로 변경하려면 다음을 권장합니다 sed.

 sed -e 's/[\t ]\+/_/'

헤더 행을 무시해야 하는 경우:

sed -e '/^#/! s/[\t ]\+/_/'

또는 보다 일반적인 경우(헤더는 모든 문자로 시작할 수 있으며 \t에만 적용됨 gnu sed)

sed -E '1! s/[[:blank:]]+/_/'

awk코드에 대한 질문 의 경우 첫 번째 코드는 아마도 보기 흉한 개행 문자를 인쇄하지 않도록 printa 여야 합니다 .printf

답변2

코드부터 시작하면 원하는 출력이 제공됩니다.

awk ' NR>1 { 
             printf( $1"_"$2 ); 
             for (i=3;i<NF;i++) printf("\t%s", $i); 
             printf("\n") 
           } 
      NR==1 { print } ' input > output  

답변3

이것은 작동하는 것 같습니다:

awk '{ if(NR>1) { printf $1"_"$2; for(i=3;i<NF;i++) {printf "\t"$i } } print "" }' input

답변4

다음은 작업을 수행하는 작은 Python 3 스크립트입니다. 여기서 기본 전제는 두 개의 변수를 사용하여 각 줄의 문자를 문자별로 읽는 것입니다. 하나는 열 1에서 두 번째 밑줄이 기록되었는지 여부를 추적하고 다른 변수는 공백을 밑줄로 바꾸는 것이 허용되는지 여부를 추적합니다.

OP의 입력 파일 형식에서 두 번째 열이 모두 숫자라는 것을 알았습니다. 따라서 공백을 밑줄로 바꾸는 것부터 시작할 수 있지만 밑줄을 쓰고 숫자 문자를 만나면(두 조건 모두 참임) 해당 변수를 끄면 write_ok다른 공백이 평소대로 인쇄됩니다.

#!/usr/bin/env python3
import sys
import os

def count_first_spaces(string):
    write_ok = True
    underscores_ok = False 

    for char in string:
        if char == " " and write_ok:
           print("_",end="")
           underscores_ok = True
           continue
        if underscores_ok  and char.isdigit():
           write_ok = False
        print(char,end="")
    print("") # add newline 

def main():
    if not os.path.isfile(sys.argv[1]): sys.exit(1)
    with open(sys.argv[1]) as fd:
        for line in fd:
            if line.startswith('#'): print(line.strip())
            else: count_first_spaces(line.strip()) 

if __name__ == '__main__': main()            

테스트 실행은 다음과 같습니다.

$ ./add_underscore.py  input.txt                                                                                         
#CHROM  POS     REF     ALT     ../S101_sorted.bam      ../S102_sorted.bam          ../S105_sorted.bam      ../S107_sorted.bam      ../S113_sorted.bam      ../S114_sorted.bam      ../S115_sorted.bam      ../S
Aradu.A01_______296611  T       C       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T/C     T       T/C     T       T       T       T
Aradu.A01_______326689  T       C       T/C     T       T       T       T/C     T       T       T       T/C     T/C     T       T       T       T       T       T       T       T/C     T/C     T       T
Aradu.A01_______615910  T       G       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T       T
Aradu.A01_______661394  T       A       T       T       T       T       T       T/A     T       T       T       T       T       T       T       T       T       T       T       T       T       T       T

이 데이터를 다른 파일에 저장하려면 다음을 실행하십시오../add_underscore.py input.txt > output.txt

관련 정보