テキストファイルがあります(例:)。
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