列の値に基づくサブセットファイルの内容

列の値に基づくサブセットファイルの内容

テキストファイルがあります(例:)。

apple   V$NFY_Q6_rc V=0.741
apple   V$HOXA7_01_rc   V=0.454
apple   V$ALPHACP1_01_rc    V=0.695
orange  V$SP4_Q5    V=0.747
grapes  V$SP1_Q2_01 V=0.677
grapes  V$SP1_Q6_01_rc  V=0.685
grapes  V$SP1_Q6_rc V=0.884

各果物について、最も高いV値を持つ行(列3)を抽出したいと思います。私の出力は次のようになります。

apple   V$NFY_Q6_rc V=0.741
orange  V$SP4_Q5    V=0.747
grapes  V$SP1_Q6_rc V=0.884

異なるサブディレクトリには、このようなファイルが複数あります。

サブセットを作成したら、次のコードを使用して、列2で特定の文字列が発生した回数を取得します。

        perl -lanE '$str=$F[1];  $f="/home/$str/list/$str.txt"; $c=`grep -c "$str" "$f"`;chomp($c);$x=0;$x++ if $c;say "$str\t$x\t$c"' file2

これにより、次のような出力が生成されます。ファイルの列2から文字列「SP4」を検索するとします。

         X       X in file?  number of times it occurs
        NFA            0                            0
        SP4            1                            2
        NFATC1         0                            0

V値が必要です(上記の値はこの表に含まれています)

          X       X in file?  number of times it occurs      V value
        NFA            0                            0
        SP4            1                            2         0.747
        NFATC1         0                            0

PS:介入するPerlプログラムの詳細については、次のリンクを参照してください。

         http://stackoverflow.com/questions/23109490/search-for-occurrence-of-a-string-in-another-file-in-a-particular-column

ベストアンサー1

順序が重要でない場合は、2回通過するだけsortです。最初のステップでは、フィールド1を基準に並べ替え、フィールド3の数値部分(位置4から始まる)に基づいて逆順に並べ替えます。この-b修飾子は先行スペースを無視するようにします。このパイプを 2 番目のパイプに渡し、sortフィールド 1 の固有値ごとに 1 つのレコードを返します。ただし、今回は安定したsort(-s)修飾子を指定して、フィールド3(各値までバブリング)で最も高い値を持つレコードを保証します。フィールド1、前のソートを返す)

sort -k1,1 -k3.4b,3nr file.txt | sort -k1,1 -s -u
apple   V$NFY_Q6_rc V=0.741
grapes  V$SP1_Q6_rc V=0.884
orange  V$SP4_Q5    V=0.747

おすすめ記事