8번째와 9번째 필드/열을 생성하고 적절한 문자를 4열과 5열의 숫자로 인코딩하고 싶습니다. 콜론으로 구분된 6개의 숫자는 다음과 같습니다.A:T:C:G:N:del
참고: 열 6과 7의 일부 행이 비어 있었습니다. NA를 삽입하여 이 문제를 해결했습니다.
awk -F'[[:space:]]' '$5 && !$6{ $6="NA" }1'
awk -F'[[:space:]]' '$6 && !$7{ $7="NA" }1'
그런 다음 다시 탭을 사용하여 파일을 구분하십시오.sed -e 's/ /\t/g'
파일.tsv
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant
출력 example.tsv
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region C A
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant C T
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region T C
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region C T
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region T C
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant G A
어떤 도움이라도 대단히 감사하겠습니다! !
답변1
$ cat tst.awk
BEGIN {
FS=OFS="\t"
split("A:T:C:G:N:del",map,/:/)
}
{ print $0, vals2id($4), vals2id($5) }
function vals2id(vals, arr, i, id) {
split(vals,arr,/:/)
for (i in arr) {
if (arr[i] != 0) {
id = map[i]
}
}
return id
}
$ awk -f tst.awk file
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region C A
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant C T
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region T C
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region C T
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region T C
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant G A
답변2
나는 다음 sed 스크립트가 당신이 원하는 것을 할 것이라고 믿습니다:
s/\t[1-9][0-9]*:0:0:0:0:[^\t]*\t/&A\t/g
s/\t0:[1-9][0-9]*:0:0:0:[^\t]*\t/&T\t/g
s/\t0:0:[1-9][0-9]*:0:0:[^\t]*\t/&C\t/g
s/\t0:0:0:[1-9][0-9]*:0:[^\t]*\t/&G\t/g
s/\t0:0:0:0:[1-9][0-9]*:[^\t]*\t/&N\t/g
s/\t0:0:0:0:0:[1-9][0-9]*\t/&del\t/g
s/^\t(([^\t]*\t){4})([^\t]*)\t([^\t]*)(\t[^\t]*)(\t.*)/\1\4\6\t\3\5/
달리다:
sed -rf script.sed file.tsv > output.tsv
답변3
Perl과 sed 유틸리티를 사용하여 다음을 수행할 수 있습니다.
perl -F'\t' -pale '$"="\t";
/(?:^|:)(?=[1-9])/g, push(@F, qw[A T C G N del][+pos>>1]) for @F[3,4];
$_="@F";
' file.tsv
NW_006532398.1 302035 C 0:0:32:0:0:0 42:0:0:0:0:0 KCND2 intergenic_region C A
NW_006532398.1 302035 C 0:0:0:0:0:2 42:0:0:0:0:0 KCND2 intergenic_region del A
NW_006532656.1 289636 C 0:0:28:0:0:0 0:28:0:0:0:0 CNTN1 intron_variant C T
NW_006532762.1 6396 C 0:54:0:0:0:0 0:0:53:0:0:0 NA intergenic_region T C
NW_006532762.1 25741 C 0:0:62:0:0:0 0:43:0:0:0:0 NA intergenic_region C T
NW_006532762.1 32304 T 0:60:0:0:0:0 0:0:49:0:0:0 NA intergenic_region T C
NW_006532762.1 179065 G 0:0:0:45:0:0 59:0:0:0:0:0 DOCK4 intron_variant G A
sed -re '
1{x;s/.*/A:T:C:G:N:del/;x;}
s/\t/&\n/3;G;ba
:b;s/\t/&\n/4;G
:a;s/\n0:(.*)\n[^:]+:/0:\n\1\n/;ta
s/\n//;s/\n([^:]+)/\t\1\n/;s/\n.*//;s/^//;tc
:c;s/\t/&/8;t;bb
' file.tsv
설명하다:
현재 레코드의
$F[3]
네 번째 및 다섯 번째 필드(일명 행)에서$F[4]
$_
(필드 내에서) 0이 아닌 첫 번째 숫자의 위치를 결정합니다. 사실에 의존
2개의 위치를 차지하여 찾은 위치를 절반으로 줄여 필드에 대한 익명 배열 인덱스를
0:
얻습니다 .qw[A T C G N del]
이제 발견된 A/T/C/G/N 또는 del을 배열에 추가하기만 하면 됩니다
@F
.@F
그런 다음 (탭)을 사용하여 배열을 추론$"
한 다음 인쇄합니다.
가정:
- 선행 TAB이 없으면 배열의 필드 수가 삭제됩니다
@F
. - 네 번째 및 다섯 번째 필드는 가정됩니다
one-hot
. 이는 항상 0이 아닌 숫자가 확실히 존재함을 의미합니다. - 네 번째 및 다섯 번째 필드에는 0으로 시작하는 0이 아닌 숫자가 없습니다.
- 네 번째 및 다섯 번째 필드에는 00이 모두 0으로 표시되지 않습니다.
- 네 번째 및 다섯 번째 필드에는 단일 콜론으로 구분된 정확히 6개의 숫자가 있으며 후행/선행 콜론은 없습니다.