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