다음과 같은 파일이 있습니다.
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개의 열이 포함되도록 변경됩니다.awk
FS
tab
답변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.
}