2016-11-28 6 views
0

awkでは、$10 = reference standard$3の値が一致する行を印刷しようとしています。私の実際のデータは数千のtab-delimited行なので、入力と出力の両方がtab-delimitedに設定されています。ありがとうございました :)。awkは一致し、特定の値をフィールド内に表示します

awkの

awk -F'\t' -v OFS='\t' 'FNR==NR{a[$0];next} $(NF-1)$NF=="referencestandard" && {A[$3];next}$3 in A in a{print}' file 
awk: cmd. line:1: FNR==NR{a[$0];next} $(NF-1)$NF=="referencestandard" && {A[$3];next}$3 in A in a{print} 
awk: cmd. line:1:              ^syntax error 

ファイル

#tax_id GeneID Symbol RSG LRG RNA t Protein p Category 
9606 4200 ME2 NG_016198.1  NM_002396.4  NP_002387.1  reference standard 
9606 2122 MECOM NG_028279.1  NM_004991.3  NP_004982.2  reference standard 
9606 4204 MECP2 NG_007107.2  NM_004992.3  NP_004983.1  reference standard 
9606 4204 MECP2 NG_007107.2  NM_001110792.1  NP_001104262.1  reference standard 

000わずか数行のために所望の出力

9606 4204 MECP2 NG_007107.2  NM_004992.3  NP_004983.1  reference standard 
9606 4204 MECP2 NG_007107.2  NM_001110792.1  NP_001104262.1  reference standard 
+1

'&'の前に '{'?また、フィールドには '$ 1'から' $ NF'まで番号が付けられます。 '$ 0'は行全体です。表示されたデータから判断すると、 '参照'と '標準'の間にタブはありません。 'FNR == NR'の条件は、ファイルが読み込まれ、保存されたことを意味します。読み取るべき第2のファイルがないので、以下の用語は決して実行されない。あなたは 'END'ブロックでそれを行うことができます。あなたと '$ 3'の値が一致することが何を意味するのかは明確ではありません - 彼らは何を一致させる必要がありますか?あなたが探しているものを明確にする必要があります。要件が完全に記述されたら、これを行うのは難しくありません。 –

+0

'$ 3 'の値が一致するということは、それらが同じであることを意味します。 '$ 3 'の値は数回繰り返すことができますが、通常は'参照標準 'という値が1つしかありません。私はその基準を満たしていないファイルを指差すようにしています...それは '$ 3'値が同じで' $ 10'が '参照標準'です。ありがとうございました :)。 – Chris

+1

より正確にする必要があります。あなたは '$ 3'で同じ値を持つ2つの異なる行を意味しますか?他の分野の何があっても関係なく?そして、両方の行が印刷されますか? $ 3に同じ値を持つ3行がある場合は、3行または3ペアを印刷しますか?あなたのサンプルデータでは、 '$ 3'の繰り返しも' $ 1'と '$ 2'(と' $ 4')の値を繰り返します - それは重要ですか? –

答えて

1

、それは(私がしたデータファイルを処理することが、おそらく最も簡単ですdata)2回リストそれはコマンドライン上で2回実行されます。最初のパスでは、$3の値が発生した回数を記録し、最後のフィールドを 'reference standard'に設定します。 2回目のパスで、「参照標準」と$3大きい1よりの出現回数に設定された最後のフィールドで、それらのレコードを印刷:サンプルデータについては

awk -F'\t' -v OFS='\t' \ 
    'FNR == NR && $NF == "reference standard" { a[$3]++; next } 
    a[$3] > 1 && $NF == "reference standard" { print }' data data 

、私が得た出力されました:

9606 4204 MECP2 NG_007107.2  NM_004992.3  NP_004983.1  reference standard 
9606 4204 MECP2 NG_007107.2  NM_001110792.1 NP_001104262.1 reference standard 

このテクニックは、ファイルのコピー全体をメモリに保存することを避け、他のブックキープの問題を回避します。あなたのコードは既にFNR==NRのmemeを持っていたので、あなたはコマンドラインでファイル名を繰り返さなくても、あなたはこれらの行を少し考えていたと思います。

あなたはメモリ内のファイル全体を維持するために余裕がある(あるいは、それはファイルの代わりにパイプから来ているので、あなたはそれを再スキャンすることができない)場合は、このような単一のパスでそれを行うことができます。

awk -F'\t' -v OFS='\t' \ 
    'FNR==NR && $NF == "reference standard" { 
      index = a[$3]++; line[NR] = $0; reps[$3,index] = NR; next 
    } 
    END { for (i in a) 
       if (a[i] > 1) 
        for (j = 0; j < a[$3]; j++) 
         print line[reps[i,j]] 
    }' data 

これはもちろん、同じ出力を生成します。欠点は、メモリー内に完全なデータセットのコピーとさまざまな制御配列があるため、2パスの代替方法よりもはるかに多くのメモリーを使用することです。

+0

ありがとう、私は同じ行に沿って考えていたが、それを実装する方法がわからなかった....助けと説明をありがとう:) – Chris

関連する問題