異なる列に異なる情報を含む行の抽出

異なる列に異なる情報を含む行の抽出

さまざまな情報を含むビッグデータファイルがあります。このファイルの特定の行を選択して別のファイルにコピーする必要があります。

my_file.txt(列は区切り文字で区切られます"tab"。最初の列のみを報告しましたが、それ以降は追加情報があります)

2543行と22列があります。

4gga_A_001_______________   clust_001   APC-coactivator_clust_001   4GGA-A  Q12834  2.04    CDC20   APC-coactivator
4ggc_A_002_______________   clust_001   APC-coactivator_clust_001   4GGC-A  Q12834  1.35    CDC20   APC-coactivator
4ggd_A_002_______________   clust_001   APC-coactivator_clust_001   4GGD-A  Q12834  2.43    CDC20   APC-coactivator
4n14_A_002_______________   clust_001   APC-coactivator_clust_001   4N14-A  Q12834  2.1 CDC20   APC-coactivator
5g04_R_002_______________   clust_001   APC-coactivator_clust_001   5G04-R  Q12834  3.9 CDC20   APC-coactivator
5khu_R_006_______________   clust_001   APC-coactivator_clust_001   5KHU-R  Q12834  4.8 CDC20   APC-coactivator
5lcw_Q_002_______________   clust_001   APC-coactivator_clust_001   5LCW-Q  Q12834  4.2 CDC20   APC-coactivator
6q6g_R_004_______________   clust_001   APC-coactivator_clust_001   6Q6G-R  Q12834  3.2 CDC20   APC-coactivator
6q6h_R_003_______________   clust_001   APC-coactivator_clust_001   6Q6H-R  Q12834  3.2 CDC20   APC-coactivator
6q6g_R_005_______________   clust_016   APC-coactivator_clust_016   6Q6G-R  Q12834  3.2 CDC20   APC-coactivator
6q6h_R_002_______________   clust_017   APC-coactivator_clust_017   6Q6H-R  Q12834  3.2 CDC20   APC-coactivator
1u6d_X_001_______________   clust_001   BTB_clust_001   1u6d_X  Q14145  1.85    KEAP1   BTB
1zgk_A_001_______________   clust_001   BTB_clust_001   1zgk_A  Q14145  1.35    KEAP1   BTB
2vpj_A_001_______________   clust_001   BTB_clust_001   2vpj_A  Q53G59  1.85    KLHL12  BTB
2xn4_A_001_______________   clust_001   BTB_clust_001   2xn4_A  O95198  1.99    KLHL2   BTB
3vng_A_001_______________   clust_001   BTB_clust_001   3vng_A  Q14145  2.1 KEAP1   BTB
3vnh_A_001_______________   clust_001   BTB_clust_001   3vnh_A  Q14145  2.1 KEAP1   BTB
3zgc_A_001_______________   clust_001   BTB_clust_001   3zgc_A  Q14145  2.2 KEAP1   BTB
3zgd_A_001_______________   clust_001   BTB_clust_001   3zgd_A  Q14145  1.98    KEAP1   BTB
4ch9_A_001_______________   clust_001   BTB_clust_001   4ch9_A  Q9UH77  1.84    KLHL3   BTB
4chb_A_001_______________   clust_001   BTB_clust_001   4chb_A  O95198  1.56    KLHL2   BTB
4ifj_A_001_______________   clust_001   BTB_clust_001   4ifj_A  Q14145  1.8 KEAP1   BTB
4ifl_X_001_______________   clust_001   BTB_clust_001   4ifl_X  Q14145  1.8 KEAP1   BTB
4ifn_X_001_______________   clust_001   BTB_clust_001   4ifn_X  Q14145  2.4 KEAP1   BTB
4in4_A_001_______________   clust_001   BTB_clust_001   4in4_A  Q14145  2.59    KEAP1   BTB
4iqk_A_001_______________   clust_001   BTB_clust_001   4iqk_A  Q14145  1.97    KEAP1   BTB
4l7b_A_001_______________   clust_001   BTB_clust_001   4l7b_A  Q14145  2.41    KEAP1   BTB
4l7b_B_001_______________   clust_001   BTB_clust_001   4l7b_B  Q14145  2.41    KEAP1   BTB
4l7c_A_001_______________   clust_001   BTB_clust_001   4l7c_A  Q14145  2.4 KEAP1   BTB
4l7d_A_001_______________   clust_001   BTB_clust_001   4l7d_A  Q14145  2.25    KEAP1   BTB
4n1b_A_001_______________   clust_001   BTB_clust_001   4n1b_A  Q14145  2.55    KEAP1   BTB
4xmb_A_001_______________   clust_001   BTB_clust_001   4xmb_A  Q14145  2.43    KEAP1   BTB
5f72_C_001_______________   clust_001   BTB_clust_001   5f72_C  Q14145  1.85    KEAP1   BTB
5nkp_A_001_______________   clust_001   BTB_clust_001   5nkp_A  Q9UH77  2.8 KLHL3   BTB
5wfl_A_001_______________   clust_001   BTB_clust_001   5wfl_A  Q14145  1.93    KEAP1   BTB
5wfv_A_001_______________   clust_001   BTB_clust_001   5wfv_A  Q14145  1.91    KEAP1   BTB
5wg1_A_002_______________   clust_001   BTB_clust_001   5wg1_A  Q14145  2.02    KEAP1   BTB
5whl_A_002_______________   clust_001   BTB_clust_001   5whl_A  Q14145  2.5 KEAP1   BTB
5whl_B_001_______________   clust_001   BTB_clust_001   5whl_B  Q14145  2.5 KEAP1   BTB
5who_A_002_______________   clust_001   BTB_clust_001   5who_A  Q14145  2.23    KEAP1   BTB
5who_B_001_______________   clust_001   BTB_clust_001   5who_B  Q14145  2.23    KEAP1   BTB
5wiy_A_001_______________   clust_001   BTB_clust_001   5wiy_A  Q14145  2.23    KEAP1   BTB
5wiy_B_001_______________   clust_001   BTB_clust_001   5wiy_B  Q14145  2.23    KEAP1   BTB
5x54_A_001_______________   clust_001   BTB_clust_001   5x54_A  Q14145  2.3 KEAP1   BTB
5yq4_A_001_______________   clust_001   BTB_clust_001   5yq4_A  Q9Y2M5  1.58    KLHL20  BTB
5yy8_A_001_______________   clust_001   BTB_clust_001   5yy8_A  Q9Y6Y0  1.98    IVNS1ABP    BTB
6fmp_A_001_______________   clust_001   BTB_clust_001   6fmp_A  Q14145  2.92    KEAP1   BTB
6fmq_A_001_______________   clust_001   BTB_clust_001   6fmq_A  Q14145  2.1 KEAP1   BTB
6gy5_A_001_______________   clust_001   BTB_clust_001   6gy5_A  Q9Y2M5  1.09    KLHL20  BTB
6hws_A_001_______________   clust_001   BTB_clust_001   6hws_A  Q14145  1.75    KEAP1   BTB
6n3h_A_001_______________   clust_001   BTB_clust_001   6n3h_A  Q9Y6Y0  2.6 IVNS1ABP    BTB
6rog_A_001_______________   clust_001   BTB_clust_001   6rog_A  Q14145  2.16    KEAP1   BTB

3番目、5番目、6番目の列の値を使用して行を抽出する必要があります。詳しくは、同じ 3 番目の列文字列 (APC-coactivator_clust_001 や APC-coactivator_clust_016...) の場合、列値の各個別の 5 番目の列値 (例: Q12834...) に対応する最低 6 番目の列値抽出する必要があります。私が十分に明確に説明したかどうかわかりません。とにかく、私が受け取ることになっていた出力ファイルをインポートしました。

outpout.txt

4ggc_A_002_______________   clust_001   APC-coactivator_clust_001   4GGC-A  Q12834  1.35    CDC20   APC-coactivator
6q6g_R_005_______________   clust_016   APC-coactivator_clust_016   6Q6G-R  Q12834  3.2 CDC20   APC-coactivator
6q6h_R_002_______________   clust_017   APC-coactivator_clust_017   6Q6H-R  Q12834  3.2 CDC20   APC-coactivator
1zgk_A_001_______________   clust_001   BTB_clust_001   1zgk_A  Q14145  1.35    KEAP1   BTB
2vpj_A_001_______________   clust_001   BTB_clust_001   2vpj_A  Q53G59  1.85    KLHL12  BTB
4chb_A_001_______________   clust_001   BTB_clust_001   4chb_A  O95198  1.56    KLHL2   BTB
4ch9_A_001_______________   clust_001   BTB_clust_001   4ch9_A  Q9UH77  1.84    KLHL3   BTB
5yy8_A_001_______________   clust_001   BTB_clust_001   5yy8_A  Q9Y6Y0  1.98    IVNS1ABP    BTB
6gy5_A_001_______________   clust_001   BTB_clust_001   6gy5_A  Q9Y2M5  1.09    KLHL20  BTB

答え1

awk入力ファイルを一度だけ使用して処理します。

awk 'min[$3, $5]!=""{ if(min[$3, $5]>$6){ line[$3, $5]=$0; min[$3, $5]=$6}; next }
                    { min[$3, $5]=$6; line[$3, $5]=$0 }
END{ for(x in line) print line[x] }' infile

到着「同じ最小値でラインを維持」6列

awk 'min[$3, $5]!=""{ if(min[$3, $5] >$6){ line[$3, $5]=$0; min[$3, $5]=$6 };
                      if(min[$3, $5]==$6){ line[$3, $5]=line[$3, $5] ORS $0 }; next
                    }
                    { min[$3, $5]=$6; line[$3, $5]=$0 }
END{ for(x in line) print line[x] }' infile

答え2

そしてawk

FNR==NR && !seen[$3,$5]++ {val[$3,$5]=$6}
FNR==NR && seen[$3,$5] {if ($6<val[$3,$5]) {val[$3,$5]=$6} }
 
NR!=FNR && val[$3,$5]==$6

次に実行

awk -f script.awk input input

それは何をしますか?

作る擬似多次元配列列3と5をインデックスとして使用し、

  1. その要素がない場合は、列6の値を取得します。
  2. そのような要素が存在する場合は、値を6列と比較してより小さい要素を選択します。
  3. 次に、ファイルを再度実行し、配列インデックスが列 3 と 5 に一致し、列 6 の値が配列要素に一致する各行を選択します。

ファイルは 2 回実行されますが、RAM 使用率は非常に低いです。ソートは入力ファイルに示されているとおりです。

答え3

sort -t$'\t' -k3,3 -k5,5 -k6n,6 file | awk -F\\t '!seen[$3,$5]++'

主にsortフィールド 6 の数値ソートに使用されます。次も動作します。

sort -t$'\t' -k6n,6 file | awk -F\\t '!seen[$3,$5]++'

ただし、出力は列3と5にグループ化されていません。awk一意の列の3/5ペアを含む最初の行を印刷するために使用されます。 C文字列をサポートしていないシェルで使用できます"$(printf '\t')"$'\t'$'...'

awk はファイルを 2 回処理し、入力と同じ順序を維持し、同じ最小値で行を維持します。

awk '
FNR==NR {if (min[$3,$5]=="" || $6<min[$3,$5]) min[$3,$5]=$6; next} $6==min[$3,$5]
' file file

答え4

出力は提案された順序とは異なるため、順序が重要でない場合は次のことができます。

sort -s -k3,3 -k5,5 -k6,6n < in | perl -ane 'print unless $seen{$F[2]}{$F[4]}++' > out

元の順序を維持するには、次を実行できます。

nl < in | sort -s -k4,4 -k6,6 -k7,7n | perl -ane 'print unless $seen{$F[3]}{$F[5]}++' | sort -k1,1n | cut -f2- > out

しかし、サンプル出力いいえ元の順序は維持されます(grep 4ch[9b]_A_001入力と出力のサンプルに見られるように)。

関連情報