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

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

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番目のフィールド)の値をその位置に挿入します。

答え2

コードの外観のために、GNU sed次のようにすることができます。

sed -Ee '
   $!N
   s|^(\S+\t\S+\t)(\S+)(\t\S+\t\S+\t\S+)(\n)\1(\S+)\3$|\4\1\2/\5\3|
   /^\n/!P;D
' yourfile

結果

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

布材

  • GNU sed拡張REを有効にするオプションと一緒に呼び出されます-E
  • eofでない場合は、パターンの次の行をロードします。
  • フィールド間に先行/後続TABがないか、複数のTABがないとします。
  • $1 $2 を \1 に入れ、$3 を \2 に入れ、$4、$5、$6 を \3 に入れます。
  • 次に、図のようにサブコンポーネントを作成します。成功すると、BOLはスラッシュと改行で区切って、次の行の$ 3を現在の行の$ 3に移動します。
  • その後、サブルーチンが失敗した場合は、現在の行(OTW)を印刷し、パターンスペースの内容でsedコードを再実行します。

答え3

Pythonを使用してこれを行う1つの方法は次のとおりです。

パスワード:

from collections import OrderedDict
data = OrderedDict()
with open('file1', 'rU') as f:
    for line in f.readlines():
        line = line.split('\t')
        key = tuple(line[:2] + line[3:])
        data.setdefault(key, []).append(line[2])

with open('file2', 'w') as f:
    for k, v in data.items():
        f.write('\t'.join([k[0], k[1], '/'.join(v)] + list(k[2:])))

結果:

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

関連情報