さまざまな情報を含むビッグデータファイルがあります。このファイルの特定の行を選択して別のファイルにコピーする必要があります。
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をインデックスとして使用し、
- その要素がない場合は、列6の値を取得します。
- そのような要素が存在する場合は、値を6列と比較してより小さい要素を選択します。
- 次に、ファイルを再度実行し、配列インデックスが列 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
入力と出力のサンプルに見られるように)。