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

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

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

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

答え2

そしてawk

awk -F'[ =]' '$NF>a[$1]{a[$1]=$NF;b[$1]=$0}END{for (i in b) print b[i]}' filename.txt

これは、最初の列にインデックス付けされたV値の配列を作成することによって行われます。各行に対して、V値をそのインデックスの配列の現在の値と比較し、大きい場合は配列の値を更新し、行全体を2番目の配列に格納します。 b。ファイル全体が処理された後、bのすべての内容が印刷されます。

出力例:

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

順序が重要な場合はパイプできますsort(たとえば、V番号でソート)。

awk -F'[ =]' '$NF>a[$1]{a[$1]=$NF;b[$1]=$0}END{for (i in b) print b[i]}' filename.txt | sort -t= -nk2

以下を提供します。

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

実際のケース:http://ideone.com/WPvRzh

答え3

解決策は次のとおりですperl

$ perl -F'\s+|=' -anle '
    $h{$F[0]} = [$F[-1],$_] if $F[-1] > $h{$F[0]}->[0];
    END {print $h{$_}->[1] for keys %h}' file
grapes  V$SP1_Q6_rc V=0.884
apple   V$NFY_Q6_rc V=0.741
orange  V$SP4_Q5    V=0.747

修正する

2つの単一コード行を実行した後に2つの結果があるとします。

file1:

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

file2:

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

次のことを試すことができます。

$ awk -F'[ =]+' 'FNR==NR{a[$2]=$NF;next}
            FNR==1{print $0"\tV value";next}
            {for(i in a){
                if(index(i,$1)){
                    print $0"\t"a[i];
                    next;
                }
            }
            print;
        }' file1 file2
X       X in file?  number of times it occurs   V value
NFA            0                            0
SP4            1                            2   0.747
NFATC1         0                            0

関連情報