列のパターンで始まる情報のみを選択して別の列に印刷する方法

列のパターンで始まる情報のみを選択して別の列に印刷する方法

データファイルがあります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

おすすめ記事