データファイルがありますA.tsv
(フィールド区切り記号= \t
)。
id clade mutation
243 40A S:ojo,L:juju,S:lili
254
267 40B J:jijy,S:asel,M:ase
次のように、別の列(新しいファイルB.tsv
)で始まる突然変異のみを印刷したいと思います。S:
id clade mutation S_mutation
243 40A S:ojo,L:juju,S:lili S:ojo,S:lili
254
267 40B J:jijy,S:asel,M:ase S:asel
awkでいくつかのコマンドを試しましたが、結果はありません。
awk -F '\t' 'BEGIN { OFS = FS } NR==1 {$(NF+1)="S_Mutation"} ; NR != 1 { $4 = ($3==^[Ss] ? $4 ) }; 1' A.tsv > B.tsv
何をすべきか知っていますか?ありがとう
ベストアンサー1
これにより、POSIX awk
図のように機能することができます。カンマ付きの3番目のフィールドを1より大きい行に分割し、S:で始まる要素を選択し、コンマで連結して最後の+1フィールドにします。
awk -F '\t' '
BEGIN {
OFS = FS
_SEP_ = ","
}
NR==1{$(NF+1) = "S_mutation"}
NR>1&&length($3)>0{
nf = split($3, a, _SEP_)
t = ""
for (i=1; i<=nf; i++) {
if (a[i] ~ /^S:/) {
t = t (t=="" ? t : _SEP_) a[i]
}
}
$(NF+1) = t
}1
' file
同じPerl
ですが、正規表現を使うと
perl -lnse '$,="\t";
print $_,($.==1?q(S_mutation):
"@{[/(?:\t|,)\KS:[^,]*/g]}"||());
' -- -\"=, ./file
出力:
id clade mutation S-mutation
243 40A S:ojo,L:juju,S:lili S:ojo,S:lili
254
267 40B J:jijy,S:asel,M:ase S:asel