1

私は次の2つのコードを持っています:

nut=`awk "/$1/{getline; print}" ids_lengths.txt`

grep -v '#' neco.txt |
grep -v 'seq-name' |
grep -E '(\S+\s+){13}\bAC(.)+CA\b' |
awk '$6 >= 49 { print }' |
awk '$6 <= 180 { print }' |
awk '$4 > 1 { print }' |
awk '$5 < $nut { print }' |
wc -l

この場所の「nut」をスクリプトで置き換えたいと思います。

awk '$4 < $nut { print }'

これから返される番号で:

nut=`awk "/$1/{getline; print}" ids_lengths.txt`

ただし、上記のコードの $1 は、ids_lengths.txt の列ではなく、neco.txt の最初の列を表す必要があります。(同様に、メイン コードで $6 と $4 を使用します)。

これらのネストされた awks を解決する方法のヘルプは、間違いなく高く評価されます:-)


編集: 入力ファイル (neco.txt) の行は次のようになります。

FZWTUY402JKYFZ  2   100.000 3   11  9     4.500 7   0   0   0   .   TG  TGTGTGTGT

最大の問題は、最初の列 (FZWTUY402JKYFZ など) で検索するときに、別のファイル (ids_lengths.txt) から取得した 5 列目の数値よりも小さい数値を持つ行をフィルター処理したいことです。そのため、ドラフトスクリプトに「nut」変数を入れました:-)

ids_lengths.txt は次のようになります。

>FZWTUY402JKYFZ 
153
>FZWTUY402JXI9S 
42
>FZWTUY402JMZO4 
158
4

2 に答える 2

4

grep -v2 つの操作と 4 つの連続した操作をそれぞれ 1 つに組み合わせることができますawk。これにより、すべてを完全に書き直すことなく、便利な経済性が得られます。

nut=`awk "/$1/{getline; print}" ids_lengths.txt`
grep -E -v '#|seq-name' neco.txt |
grep -E '(\S+\s+){13}\bAC(.)+CA\b' |
awk -vnut="$nut" '$6 >= 49 && $6 <= 180 && $4 > 1 && $5 < nut { print }' |
wc -l

awk単一のスクリプトで の値を決定nutし、値ベースのフィルタリングを実行することは気にしません。実行することはできますが、不必要に複雑になります — すべてが本番システムのパフォーマンスのボトルネックであることを証明できない限り、その場合はより多くの作業を行うことになります (その場合はおそらく Perl を使用しますが、 1 つのコマンドですべてを実行できます)。

于 2012-07-19T23:00:51.430 に答える
3

約:

awk -v select="$1" '$0 ~ select && FNR == NR { getline; nut = $0; } FNR == NR {next} $4 > 1 $5 < nut && $6 >= 49 && $6 <= 180 && ! /#/ && ! /seq-name/ && $NF ~ /^AC.+CA$/ {count++} END {print count}' neco.txt ids_lengths.txt

正規表現は、AWKが理解できるものに調整する必要があります。正規表現が提供されたサンプルデータとどのように一致するかわかりません。解決策の一部は、条件の1つとしてフィールドカウントを使用することです。おそらくNF == 13またはNF >= 13

読みやすくするために、上記のスクリプトを複数行に分けて示します。

awk -v select="$1" '
    $0 ~ select && FNR == NR {
        getline
        nut = $0; 
    }
    FNR == NR {next}
    $4 > 1
    $5 < nut && 
    $6 >= 49 && 
    $6 <= 180 && 
    ! /#/ && 
    ! /seq-name/ &&
    $NF ~ /^AC.+CA$/ {
        count++
    } 
    END {
        print count
}' ids_lengths.txt neco.txt 
于 2012-07-19T22:48:42.533 に答える