숫자가 포함된 열의 값 바꾸기

숫자가 포함된 열의 값 바꾸기

다음과 같은 파일이 있습니다.

chrom   start   stop    strand  isoform mu_codon    mut_codon2  more_info
chr22   43089055    43089055    -   NM_017436   C   300 903delC
chr22   43089715    43089717    -   NM_017436   CTT 79  241_243delTTC
chr12   53701873    53701875    -   NM_015665   TTC A   1292_1294delTTCinsA

일곱 번째 열의 값에 문자가 아닌 숫자가 포함되어 있으면 공백으로 바꾸고 싶습니다.

예를 들어, 내가 원하는 결과는 다음과 같습니다.

chrom   start   stop    strand  isoform mu_codon    mut_codon2  more_info
chr22   43089055    43089055    -   NM_017436   C       903delC
chr22   43089715    43089717    -   NM_017436   CTT     241_243delTTC
chr12   53701873    53701875    -   NM_015665   TTC A   1292_1294delTTCinsA

열이 변경되지 않도록 파일의 공간을 보존해야 합니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 아마도 awk? 나는 아직도 이러한 기술을 배우고 있습니다. 답을 설명해 주시겠어요?

답변1

예를 들어, 열을 보존하려는 경우 출력 필드 구분 기호를 non-delimited로 변경할 수 있습니다 tab. space이렇게 하면 열 개수를 사용하는 경우 추가 처리가 더 쉬워집니다. 따라서 다음을 사용할 수 있습니다 awk.

awk 'BEGIN { OFS = "\t"; }; { if ($7 ~ "^[0-9]*$") $7 = " "; else $7 = $7; }; 1'

이 섹션 에서는 BEGIN출력 필드 구분 기호( OFS)를 로 변경합니다 tab. 다음 섹션에서는 7번째에 숫자만 포함되어 있는지 확인하고 , 그렇다면 값을 로 변경하고 space, 그렇지 않으면 값을 유지합니다. 그러나 $7 = $7우리는 변경으로 인해 현재 행(레코드)을 다시 작성할 것이라고 확신합니다 OFS. 필드 구분 기호( )가 로 설정된 경우 OFS추가 처리를 위해 출력에 8개의 열이 포함되도록 변경됩니다.awkFStab

답변2

sed -e's/  *[^ 0-9]*/&\n/6;:n'      \
    -e's/\(\n[^ ]*\)[^ ]/\1 /;tn'   \
    -e's/\n//' <infile

sed다음은 수행할 수 있는 몇 가지 작업입니다 . 우리가 하는 첫 번째 일은 하나 이상의 공백이 6번째로 나타나는 것을 [^ 0-9]0개 이상의 공백이 아닌 문자 또는 숫자 문자로 바꾸고 그 뒤에 개행 문자가 오는 것입니다.

기본적으로 이는 일곱 번째 열이 숫자 이외의 공백이나 문자로 모두 구성된 경우 sed줄 바꿈 문자가 추가되고, 그렇지 않으면 sed줄 바꿈 문자가 추가된다는 의미입니다.

다음 명령문에서는 패턴 공간에서 개행 문자 바로 뒤에 공백이 아닌 모든 문자를 공백 문자로 바꿉니다. 물론 이는 개행 문자 뒤에 공백 문자가 없는 경우에만 발생하며, 이는 일곱 번째 열이 숫자가 아닌 경우에 발생합니다.

마지막으로 삽입된 개행 문자를 제거합니다.

산출

chrom   start   stop    strand  isoform mu_codon    mut_codon   more_info
chr22   43089055    43089055    -   NM_017436   C       903delC
chr22   43089715    43089717    -   NM_017436   CTT     241_243delTTC
chr12   53701873    53701875    -   NM_015665   TTC A   1292_1294delTTCinsA

답변3

awk '{gsub("^[0-9]*$"," ",$7);$7=$7;OFS="\t";print}' file.txt

답변4

Perl이 구조에 옵니다:

#!/usr/bin/perl
use warnings;
use strict;

while (<>) {                     # Process line by line.
    my @F = split /(\s+)/;       # Split the line into @F, keep whitespace as members, too.
    $F[12] =~ s/./ /g            # Replace any character with space
        if $F[12] =~ /^[0-9]+$/; # if there are just digits.
    print @F;                    # Print the result.
}

관련 정보