他のフィールドが一致した場合の列結合

他のフィールドが一致した場合の列結合

6つのフィールドを持つタブ区切りのファイルがあります。$1、、、$2およびフィールドが一致する場合は、$4そのフィールドを1行にマージし、フィールドを各値に関連付けたいと思います。$5$6$3/

入力.txt

1   109860777   COSN18724706    CT  C   SORT1
1   154842199   COSM3685920 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   154842199   COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   1684347 COSM1320773 C   CCCT    NADK
1   1684347 COSM1320774 C   CCCT    NADK
1   1684347 COSM5827581 C   CCCT    NADK
1   248801602   COSM246232  T   TCA OR2T35

出力.txt

1   109860777   COSN18724706    CT  C   SORT1
1   154842199   COSM3685920/COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3
1   1684347 COSM1320773/COSM1320774/COSM5827581 C   CCCT    NADK
1   248801602   COSM246232  T   TCA OR2T35

awkを試しましたが、正しい方向にpushを使用できます。

ベストアンサー1

アッ解決策:

awk '{ k=$1 FS $2 FS $4 FS $5 FS $6;  a[k]=(k in a)? a[k]"/"$3 : $3 }
     END{ for(i in a) { 
              split(i,b,FS); b[3]=a[i]"\t"b[3]; r=""; 
              for(j=1;j<=NF;j++) { 
                  r=(r!="")? r"\t"b[j] : b[j] 
              } 
              print r 
        } 
     }' input

出力:

1   1684347 COSM1320773/COSM1320774/COSM5827581 C   CCCT    NADK    
1   109860777   COSN18724706    CT  C   SORT1   
1   154842199   COSM3685920/COSM5827506 G   GGCTGCTGCTGCTGCT,GGCTGCTGCTGCTGCTGCT    KCNN3   
1   248801602   COSM246232  T   TCA OR2T35

詳細:

  • k=$1 FS $2 FS $4 FS $5 FS $6- 複雑な配列キー

  • a[k]=(k in a)? a[k]"/"$3 : $3- レコードの3番目のフィールド値を一致/グループ化フィールドに関連付けます。

  • split(i,b,FS)- 区切り記号で配列キーを分割する

  • b[3]=a[i]"\t"b[3]- 結果(3番目のフィールド)の値をその位置に挿入します。

おすすめ記事